From 879401937b164b81d57201d3534231c6106ddaa2 Mon Sep 17 00:00:00 2001 From: liuct Date: Tue, 4 Jun 2013 17:02:03 +0800 Subject: [PATCH] update the README, and output results in the relative path --- README | 81 +- commodule/impl/autoexec.py | 5 +- commodule/impl/localhost.py | 39 +- commodule/impl/tizenmobile.py | 103 +- commodule/log.py | 1 - requests/__init__.py | 71 + requests/__init__.pyc | Bin 0 -> 2375 bytes requests/adapters.py | 261 ++ requests/adapters.pyc | Bin 0 -> 8660 bytes requests/api.py | 120 + requests/api.pyc | Bin 0 -> 5270 bytes requests/auth.py | 175 ++ requests/auth.pyc | Bin 0 -> 6616 bytes requests/cacert.pem | 3290 ++++++++++++++++++++ requests/certs.py | 24 + requests/certs.pyc | Bin 0 -> 789 bytes requests/compat.py | 113 + requests/compat.pyc | Bin 0 -> 2411 bytes requests/cookies.py | 385 +++ requests/cookies.pyc | Bin 0 -> 17335 bytes requests/exceptions.py | 55 + requests/exceptions.pyc | Bin 0 -> 3061 bytes requests/hooks.py | 45 + requests/hooks.pyc | Bin 0 -> 1058 bytes requests/models.py | 673 ++++ requests/models.pyc | Bin 0 -> 19907 bytes requests/packages/__init__.py | 3 + requests/packages/__init__.pyc | Bin 0 -> 266 bytes requests/packages/charade/__init__.py | 32 + requests/packages/charade/__init__.pyc | Bin 0 -> 835 bytes requests/packages/charade/big5freq.py | 925 ++++++ requests/packages/charade/big5freq.pyc | Bin 0 -> 113804 bytes requests/packages/charade/big5prober.py | 42 + requests/packages/charade/big5prober.pyc | Bin 0 -> 1188 bytes requests/packages/charade/chardistribution.py | 231 ++ requests/packages/charade/chardistribution.pyc | Bin 0 -> 8149 bytes requests/packages/charade/charsetgroupprober.py | 106 + requests/packages/charade/charsetgroupprober.pyc | Bin 0 -> 2708 bytes requests/packages/charade/charsetprober.py | 62 + requests/packages/charade/charsetprober.pyc | Bin 0 -> 2391 bytes requests/packages/charade/codingstatemachine.py | 61 + requests/packages/charade/codingstatemachine.pyc | Bin 0 -> 1953 bytes requests/packages/charade/compat.py | 34 + requests/packages/charade/compat.pyc | Bin 0 -> 607 bytes requests/packages/charade/constants.py | 39 + requests/packages/charade/constants.pyc | Bin 0 -> 356 bytes requests/packages/charade/cp949prober.py | 44 + requests/packages/charade/cp949prober.pyc | Bin 0 -> 1196 bytes requests/packages/charade/escprober.py | 86 + requests/packages/charade/escprober.pyc | Bin 0 -> 2537 bytes requests/packages/charade/escsm.py | 242 ++ requests/packages/charade/escsm.pyc | Bin 0 -> 7328 bytes requests/packages/charade/eucjpprober.py | 90 + requests/packages/charade/eucjpprober.pyc | Bin 0 -> 2946 bytes requests/packages/charade/euckrfreq.py | 596 ++++ requests/packages/charade/euckrfreq.pyc | Bin 0 -> 88795 bytes requests/packages/charade/euckrprober.py | 42 + requests/packages/charade/euckrprober.pyc | Bin 0 -> 1197 bytes requests/packages/charade/euctwfreq.py | 428 +++ requests/packages/charade/euctwfreq.pyc | Bin 0 -> 61193 bytes requests/packages/charade/euctwprober.py | 41 + requests/packages/charade/euctwprober.pyc | Bin 0 -> 1197 bytes requests/packages/charade/gb2312freq.py | 472 +++ requests/packages/charade/gb2312freq.pyc | Bin 0 -> 68811 bytes requests/packages/charade/gb2312prober.py | 41 + requests/packages/charade/gb2312prober.pyc | Bin 0 -> 1204 bytes requests/packages/charade/hebrewprober.py | 283 ++ requests/packages/charade/hebrewprober.pyc | Bin 0 -> 3644 bytes requests/packages/charade/jisfreq.py | 569 ++++ requests/packages/charade/jisfreq.pyc | Bin 0 -> 84027 bytes requests/packages/charade/jpcntx.py | 219 ++ requests/packages/charade/jpcntx.pyc | Bin 0 -> 24910 bytes requests/packages/charade/langbulgarianmodel.py | 229 ++ requests/packages/charade/langbulgarianmodel.pyc | Bin 0 -> 24909 bytes requests/packages/charade/langcyrillicmodel.py | 329 ++ requests/packages/charade/langcyrillicmodel.pyc | Bin 0 -> 30591 bytes requests/packages/charade/langgreekmodel.py | 225 ++ requests/packages/charade/langgreekmodel.pyc | Bin 0 -> 24596 bytes requests/packages/charade/langhebrewmodel.py | 201 ++ requests/packages/charade/langhebrewmodel.pyc | Bin 0 -> 23416 bytes requests/packages/charade/langhungarianmodel.py | 225 ++ requests/packages/charade/langhungarianmodel.pyc | Bin 0 -> 24893 bytes requests/packages/charade/langthaimodel.py | 200 ++ requests/packages/charade/langthaimodel.pyc | Bin 0 -> 23402 bytes requests/packages/charade/latin1prober.py | 139 + requests/packages/charade/latin1prober.pyc | Bin 0 -> 3622 bytes requests/packages/charade/mbcharsetprober.py | 86 + requests/packages/charade/mbcharsetprober.pyc | Bin 0 -> 2580 bytes requests/packages/charade/mbcsgroupprober.py | 54 + requests/packages/charade/mbcsgroupprober.pyc | Bin 0 -> 1318 bytes requests/packages/charade/mbcssm.py | 575 ++++ requests/packages/charade/mbcssm.pyc | Bin 0 -> 17685 bytes requests/packages/charade/sbcharsetprober.py | 120 + requests/packages/charade/sbcharsetprober.pyc | Bin 0 -> 3465 bytes requests/packages/charade/sbcsgroupprober.py | 69 + requests/packages/charade/sbcsgroupprober.pyc | Bin 0 -> 2003 bytes requests/packages/charade/sjisprober.py | 91 + requests/packages/charade/sjisprober.pyc | Bin 0 -> 2968 bytes requests/packages/charade/universaldetector.py | 172 + requests/packages/charade/universaldetector.pyc | Bin 0 -> 4267 bytes requests/packages/charade/utf8prober.py | 76 + requests/packages/charade/utf8prober.pyc | Bin 0 -> 2363 bytes requests/packages/urllib3/__init__.py | 58 + requests/packages/urllib3/__init__.pyc | Bin 0 -> 2125 bytes requests/packages/urllib3/_collections.py | 94 + requests/packages/urllib3/_collections.pyc | Bin 0 -> 3536 bytes requests/packages/urllib3/connectionpool.py | 579 ++++ requests/packages/urllib3/connectionpool.pyc | Bin 0 -> 17747 bytes requests/packages/urllib3/exceptions.py | 87 + requests/packages/urllib3/exceptions.pyc | Bin 0 -> 4484 bytes requests/packages/urllib3/filepost.py | 98 + requests/packages/urllib3/filepost.pyc | Bin 0 -> 3662 bytes requests/packages/urllib3/packages/__init__.py | 4 + requests/packages/urllib3/packages/__init__.pyc | Bin 0 -> 294 bytes requests/packages/urllib3/packages/ordered_dict.py | 260 ++ .../packages/urllib3/packages/ordered_dict.pyc | Bin 0 -> 10462 bytes requests/packages/urllib3/packages/six.py | 385 +++ requests/packages/urllib3/packages/six.pyc | Bin 0 -> 14266 bytes .../packages/ssl_match_hostname/__init__.py | 61 + .../packages/ssl_match_hostname/__init__.pyc | Bin 0 -> 2411 bytes requests/packages/urllib3/poolmanager.py | 182 ++ requests/packages/urllib3/poolmanager.pyc | Bin 0 -> 7244 bytes requests/packages/urllib3/request.py | 142 + requests/packages/urllib3/request.pyc | Bin 0 -> 5982 bytes requests/packages/urllib3/response.py | 214 ++ requests/packages/urllib3/response.pyc | Bin 0 -> 7026 bytes requests/packages/urllib3/util.py | 338 ++ requests/packages/urllib3/util.pyc | Bin 0 -> 9485 bytes requests/sessions.py | 515 +++ requests/sessions.pyc | Bin 0 -> 14805 bytes requests/status_codes.py | 86 + requests/status_codes.pyc | Bin 0 -> 4424 bytes requests/structures.py | 91 + requests/structures.pyc | Bin 0 -> 4707 bytes requests/utils.py | 591 ++++ requests/utils.pyc | Bin 0 -> 17365 bytes testkit-lite | 40 +- testkitlite/engines/default/runner.py | 5 +- tests/chrome-startup | 0 web/index.html | 2 +- 140 files changed, 16608 insertions(+), 144 deletions(-) create mode 100644 requests/__init__.py create mode 100644 requests/__init__.pyc create mode 100644 requests/adapters.py create mode 100644 requests/adapters.pyc create mode 100644 requests/api.py create mode 100644 requests/api.pyc create mode 100644 requests/auth.py create mode 100644 requests/auth.pyc create mode 100644 requests/cacert.pem create mode 100644 requests/certs.py create mode 100644 requests/certs.pyc create mode 100644 requests/compat.py create mode 100644 requests/compat.pyc create mode 100644 requests/cookies.py create mode 100644 requests/cookies.pyc create mode 100644 requests/exceptions.py create mode 100644 requests/exceptions.pyc create mode 100644 requests/hooks.py create mode 100644 requests/hooks.pyc create mode 100644 requests/models.py create mode 100644 requests/models.pyc create mode 100644 requests/packages/__init__.py create mode 100644 requests/packages/__init__.pyc create mode 100644 requests/packages/charade/__init__.py create mode 100644 requests/packages/charade/__init__.pyc create mode 100644 requests/packages/charade/big5freq.py create mode 100644 requests/packages/charade/big5freq.pyc create mode 100644 requests/packages/charade/big5prober.py create mode 100644 requests/packages/charade/big5prober.pyc create mode 100644 requests/packages/charade/chardistribution.py create mode 100644 requests/packages/charade/chardistribution.pyc create mode 100644 requests/packages/charade/charsetgroupprober.py create mode 100644 requests/packages/charade/charsetgroupprober.pyc create mode 100644 requests/packages/charade/charsetprober.py create mode 100644 requests/packages/charade/charsetprober.pyc create mode 100644 requests/packages/charade/codingstatemachine.py create mode 100644 requests/packages/charade/codingstatemachine.pyc create mode 100644 requests/packages/charade/compat.py create mode 100644 requests/packages/charade/compat.pyc create mode 100644 requests/packages/charade/constants.py create mode 100644 requests/packages/charade/constants.pyc create mode 100644 requests/packages/charade/cp949prober.py create mode 100644 requests/packages/charade/cp949prober.pyc create mode 100644 requests/packages/charade/escprober.py create mode 100644 requests/packages/charade/escprober.pyc create mode 100644 requests/packages/charade/escsm.py create mode 100644 requests/packages/charade/escsm.pyc create mode 100644 requests/packages/charade/eucjpprober.py create mode 100644 requests/packages/charade/eucjpprober.pyc create mode 100644 requests/packages/charade/euckrfreq.py create mode 100644 requests/packages/charade/euckrfreq.pyc create mode 100644 requests/packages/charade/euckrprober.py create mode 100644 requests/packages/charade/euckrprober.pyc create mode 100644 requests/packages/charade/euctwfreq.py create mode 100644 requests/packages/charade/euctwfreq.pyc create mode 100644 requests/packages/charade/euctwprober.py create mode 100644 requests/packages/charade/euctwprober.pyc create mode 100644 requests/packages/charade/gb2312freq.py create mode 100644 requests/packages/charade/gb2312freq.pyc create mode 100644 requests/packages/charade/gb2312prober.py create mode 100644 requests/packages/charade/gb2312prober.pyc create mode 100644 requests/packages/charade/hebrewprober.py create mode 100644 requests/packages/charade/hebrewprober.pyc create mode 100644 requests/packages/charade/jisfreq.py create mode 100644 requests/packages/charade/jisfreq.pyc create mode 100644 requests/packages/charade/jpcntx.py create mode 100644 requests/packages/charade/jpcntx.pyc create mode 100644 requests/packages/charade/langbulgarianmodel.py create mode 100644 requests/packages/charade/langbulgarianmodel.pyc create mode 100644 requests/packages/charade/langcyrillicmodel.py create mode 100644 requests/packages/charade/langcyrillicmodel.pyc create mode 100644 requests/packages/charade/langgreekmodel.py create mode 100644 requests/packages/charade/langgreekmodel.pyc create mode 100644 requests/packages/charade/langhebrewmodel.py create mode 100644 requests/packages/charade/langhebrewmodel.pyc create mode 100644 requests/packages/charade/langhungarianmodel.py create mode 100644 requests/packages/charade/langhungarianmodel.pyc create mode 100644 requests/packages/charade/langthaimodel.py create mode 100644 requests/packages/charade/langthaimodel.pyc create mode 100644 requests/packages/charade/latin1prober.py create mode 100644 requests/packages/charade/latin1prober.pyc create mode 100644 requests/packages/charade/mbcharsetprober.py create mode 100644 requests/packages/charade/mbcharsetprober.pyc create mode 100644 requests/packages/charade/mbcsgroupprober.py create mode 100644 requests/packages/charade/mbcsgroupprober.pyc create mode 100644 requests/packages/charade/mbcssm.py create mode 100644 requests/packages/charade/mbcssm.pyc create mode 100644 requests/packages/charade/sbcharsetprober.py create mode 100644 requests/packages/charade/sbcharsetprober.pyc create mode 100644 requests/packages/charade/sbcsgroupprober.py create mode 100644 requests/packages/charade/sbcsgroupprober.pyc create mode 100644 requests/packages/charade/sjisprober.py create mode 100644 requests/packages/charade/sjisprober.pyc create mode 100644 requests/packages/charade/universaldetector.py create mode 100644 requests/packages/charade/universaldetector.pyc create mode 100644 requests/packages/charade/utf8prober.py create mode 100644 requests/packages/charade/utf8prober.pyc create mode 100644 requests/packages/urllib3/__init__.py create mode 100644 requests/packages/urllib3/__init__.pyc create mode 100644 requests/packages/urllib3/_collections.py create mode 100644 requests/packages/urllib3/_collections.pyc create mode 100644 requests/packages/urllib3/connectionpool.py create mode 100644 requests/packages/urllib3/connectionpool.pyc create mode 100644 requests/packages/urllib3/exceptions.py create mode 100644 requests/packages/urllib3/exceptions.pyc create mode 100644 requests/packages/urllib3/filepost.py create mode 100644 requests/packages/urllib3/filepost.pyc create mode 100644 requests/packages/urllib3/packages/__init__.py create mode 100644 requests/packages/urllib3/packages/__init__.pyc create mode 100644 requests/packages/urllib3/packages/ordered_dict.py create mode 100644 requests/packages/urllib3/packages/ordered_dict.pyc create mode 100644 requests/packages/urllib3/packages/six.py create mode 100644 requests/packages/urllib3/packages/six.pyc create mode 100644 requests/packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc create mode 100644 requests/packages/urllib3/poolmanager.py create mode 100644 requests/packages/urllib3/poolmanager.pyc create mode 100644 requests/packages/urllib3/request.py create mode 100644 requests/packages/urllib3/request.pyc create mode 100644 requests/packages/urllib3/response.py create mode 100644 requests/packages/urllib3/response.pyc create mode 100644 requests/packages/urllib3/util.py create mode 100644 requests/packages/urllib3/util.pyc create mode 100644 requests/sessions.py create mode 100644 requests/sessions.pyc create mode 100644 requests/status_codes.py create mode 100644 requests/status_codes.pyc create mode 100644 requests/structures.py create mode 100644 requests/structures.pyc create mode 100644 requests/utils.py create mode 100644 requests/utils.pyc mode change 100644 => 100755 tests/chrome-startup diff --git a/README b/README index 3e61baf..a5f59c3 100644 --- a/README +++ b/README @@ -1,77 +1,44 @@ -Dependency: -================= -python2.7 python-pip requests - - sudo apt-get install python-pip - sudo pip install requests - -How to build: -================= - Build from source code: - sudo python setup.py build - -How to install: -================= - Install testkit lite from source code: - sudo python setup.py install - How to use: ================= At first, install a test package or prepare one tests.xml file aligned with schema files: /opt/testkit/lite/xsd/testdefinition-syntax.xsd. And then, - 1) You can run case on target: - For web test cases: - testkit-lite -f device:"//tests.xml" -e 'WRTLauncher ' - For native test cases: - testkit-lite -f device:"//tests.xml" + 1) You can run case with browser web run time : + ./testkit-lite -f "//tests.xml" -e '/browser-launcher' + + You can also run case on tizen platform WRT: + ./testkit-lite -f "//tests.xml" -e 'WRTLauncher' --comm tizenmobile - 2) You can run case in single mode : - For web test cases: - testkit-lite -f "//tests.xml" -e 'WRTLauncher ' --comm localhost - For native test cases: - testkit-lite -f "//tests.xml" --comm localhost - - 3) You can select on parser engine to simply conduct one or more tests.xml on target: - testkit-lite -f device:"//tests.xml ... //tests.xml" -e 'WRTLauncher ... ' + 2) You can select on parser engine to simply conduct one or more tests.xml on target: + ./testkit-lite -f "//tests.xml ... //tests.xml" -e 'WRTLauncher' - 4) If you want to execute both auto and manual tests: - testkit-lite -f device:"//tests.xml" + 3) If you want to execute both auto and manual tests: + ./testkit-lite -f "//tests.xml" -e '/browser-launcher' - 5) If you just want to execute manual tests: - testkit-lite -f device:"//tests.xml" -M + 4) If you just want to execute manual tests: + ./testkit-lite -f "//tests.xml" -e '/browser-launcher' -M - 6) If you just want to execute auto tests: - testkit-lite -f device:"//tests.xml" -A + 5) If you just want to execute auto tests: + ./testkit-lite -f "//tests.xml" -e '/browser-launcher' -A - 7) If you want to save test result to another file, by default it'll be under /opt/testkit/lite/latest: - testkit-lite -f device:"//tests.xml" -o /xxx.xml + 6) If you want to save test result to another file, by default it'll be under /opt/testkit/lite/latest: + ./testkit-lite -f "//tests.xml" -e '/browser-launcher' -o /xxx.xml - 8) If you want to choose some filters: - testkit-lite -f device:"//tests.xml" --status level1 --type type1 ... + 7) If you want to choose some filters: + ./testkit-lite -f "//tests.xml" -e '/browser-launcher' --status level1 --type type1 ... - 9) If you want to run test according capability: - testkit-lite -f device:"//tests.xml" --capability capability.xml + 8) If you want to run test according capability: + ./testkit-lite -f "//tests.xml" -e '/browser-launcher' --capability capability.xml - 10) At last, you can freely compose the above parameters together: - testkit-lite -f /tests.xml /tests.xml -A --priority P1 --type type1 ... - -Get Results: -================= - - Test report will be generated as tests.result.xml - The result will be under /opt/testkit/lite/latest after execution, you can also check the history results in /opt/testkit/lite/yyyy-mm-dd-HH:MM:SS.NNNNNN. + 9) At last, you can freely compose the above parameters together: + ./testkit-lite -f "/tests.xml /tests.xml" -e '/browser-launcher' -A --priority P1 --type type1 ... View Results: ================= -Test report can be viewed in HTML format, so the data in the xml result file looks more human friendly. - -Please follow the following steps to view test report: - 1) copy files: application.js back_top.png jquery.min.js testresult.xsl tests.css under directory /opt/testkit/lite/xsd/ - 2) put the files from step 1) under the same directory as the xml result file - 3) open xml result file with a web browser(IE, Chrome or Firefox) + Test report will be generated as tests.result.xml + The result will be under /path/to/testkit-lite/result/latest after execution, you can also check the history results in /opt/testkit/lite/yyyy-mm-dd-HH:MM:SS.NNNNNN. + open xml result file with a web browser(IE, Chrome or Firefox) Known Issues: ================= - diff --git a/commodule/impl/autoexec.py b/commodule/impl/autoexec.py index 95c2c38..8049a0f 100755 --- a/commodule/impl/autoexec.py +++ b/commodule/impl/autoexec.py @@ -39,8 +39,11 @@ def shell_command(cmd): stderr=subprocess.PIPE) ret1 = proc.stdout.readlines() ret2 = proc.stderr.readlines() + exit_code = proc.poll() + if exit_code is None: + exit_code = 0 result = ret1 or ret2 - return result + return [exit_code, result] def shell_command_ext(cmd="", diff --git a/commodule/impl/localhost.py b/commodule/impl/localhost.py index 6ab6327..bdd62e0 100644 --- a/commodule/impl/localhost.py +++ b/commodule/impl/localhost.py @@ -69,7 +69,7 @@ def _get_test_options(test_launcher, test_suite): if test_launcher.find('WRTLauncher') != -1: test_opt["launcher"] = "wrt-launcher" cmd = "wrt-launcher -l | grep %s | awk '{print $NF}'" % test_suite - ret = shell_command(cmd) + exit_code, ret = shell_command(cmd) if len(ret) == 0: LOGGER.info("[ test suite \"%s\" not found in target ]" % test_suite) @@ -332,7 +332,7 @@ class HostCon: os_version_str = "" # get resolution and screen size - ret = shell_command("xrandr") + exit_code, ret = shell_command("xrandr") pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)") for line in ret: match = pattern.search(line) @@ -340,15 +340,15 @@ class HostCon: resolution_str = "%s x %s" % (match.group(1), match.group(2)) screen_size_str = "%s x %s" % (match.group(3), match.group(4)) # get architecture - ret = shell_command("uname -m") + exit_code, ret = shell_command("uname -m") if len(ret) > 0: device_model_str = ret[0] # get hostname - ret = shell_command("uname -n") + exit_code, ret = shell_command("uname -n") if len(ret) > 0: device_name_str = ret[0] # get os version - ret = shell_command("cat /etc/issue") + exit_code, ret = shell_command("cat /etc/issue") for line in ret: if len(line) > 1: os_version_str = "%s %s" % (os_version_str, line) @@ -362,9 +362,8 @@ class HostCon: def __init_webtest_opt(self, params): """init the test runtime, mainly process the star up of test stub""" - result = None if params is None: - return result + return None session_id = str(uuid.uuid1()) debug_opt = "" @@ -383,16 +382,17 @@ class HostCon: test_opt = _get_test_options(test_launcher, testsuite_name) if test_opt is None: - return result + return None LOGGER.info("[ launch the stub httpserver ]") cmdline = " killall %s " % stub_app - ret = shell_command(cmdline) + exit_code, ret = shell_command(cmdline) time.sleep(2) cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt) self.__test_async_shell = StubExecThread( cmd=cmdline, sessionid=session_id) self.__test_async_shell.start() + time.sleep(2) self.__server_url = "http://%s:%s" % (HOST_NS, stub_port) timecnt = 0 @@ -404,21 +404,24 @@ class HostCon: if ret is None: LOGGER.info("[ check server status, not ready yet! ]") timecnt += 1 + continue + + if "error_code" in ret: + LOGGER.info("[ check server status, " + "get error code %d ! ]" % ret["error_code"]) + return None else: - if "error_code" in ret: - LOGGER.info("[ check server status, " - "get error code %d ! ]" % ret["error_code"]) - return result - else: - LOGGER.info("[ check server status, get ready! ]") - blaunched = True - break + LOGGER.info("[ check server status, get ready! ]") + blaunched = True + break if blaunched: ret = http_request(get_url(self.__server_url, "/init_test"), "POST", test_opt) if "error_code" in ret: + LOGGER.info("[ init test suite, " + "get error code %d ! ]" % ret["error_code"]) return None if capability_opt is not None: @@ -428,7 +431,7 @@ class HostCon: return session_id else: LOGGER.info("[ connect to server timeout! ]") - return result + return None def init_test(self, deviceid, params): """init the test envrionment""" diff --git a/commodule/impl/tizenmobile.py b/commodule/impl/tizenmobile.py index 1db7874..ff0428c 100644 --- a/commodule/impl/tizenmobile.py +++ b/commodule/impl/tizenmobile.py @@ -63,9 +63,9 @@ def _get_forward_connect(device_id, remote_port=None): else: break host_port = str(inner_port) - cmd = "sdb -s %s forward tcp:%s tcp:%s" % ( - device_id, host_port, remote_port) - shell_command(cmd) + cmd = "sdb -s %s forward tcp:%s tcp:%s" % \ + (device_id, host_port, remote_port) + exit_code, ret = shell_command(cmd) url_forward = "http://%s:%s" % (host, host_port) return url_forward @@ -73,23 +73,25 @@ def _get_forward_connect(device_id, remote_port=None): def _download_file(deviceid, remote_path, local_path): """download file from device""" cmd = "sdb -s %s pull %s %s" % (deviceid, remote_path, local_path) - ret = shell_command(cmd) - if not ret is None: - for line in ret: - if line.find("does not exist") != -1 or line.find("error:") != -1: - LOGGER.info( - "[ file \"%s\" not found in device! ]" % remote_path) - return False - return True - else: + exit_code, ret = shell_command(cmd) + if exit_code != 0: + LOGGER.info("[ Download file \"%s\" from target failed, error: %s ]" + % (remote_path, ret[0].strip('\r\n'))) return False + else: + return True def _upload_file(deviceid, remote_path, local_path): """upload file to device""" cmd = "sdb -s %s push %s %s" % (deviceid, local_path, remote_path) - ret = shell_command(cmd) - return ret + exit_code, result = shell_command(cmd) + if exit_code != 0: + LOGGER.info("[ Upload file \"%s\" failed," + " get error: %s ]" % (local_path, result)) + return False + else: + return True class StubExecThread(threading.Thread): @@ -348,7 +350,7 @@ UIFW_RESULT = "/opt/media/Documents/tcresult.xml" class QUTestExecThread(threading.Thread): - """sdb communication for serve_forever app in async mode""" + """sdb communication for Jquery Unit test suite """ def __init__(self, deviceid="", sessionid=""): super(QUTestExecThread, self).__init__() self.device_id = deviceid @@ -362,27 +364,35 @@ class QUTestExecThread(threading.Thread): TEST_SERVER_STATUS = {"finished": 0} LOCK_OBJ.release() ls_cmd = "sdb -s %s shell ls -l %s" % (self.device_id, UIFW_RESULT) + exit_code, ret = shell_command(ls_cmd) + if len(ret) > 0: + prev_stamp = ret[0] + else: + prev_stamp = "" time_stamp = "" prev_stamp = "" - LOGGER.info('[ uifw test suite start ...]') + LOGGER.info('[ web uifw test suite start ...]') time_out = 600 - query_cnt = 0 + status_cnt = 0 while time_out > 0: time.sleep(2) time_out -= 2 - ret = shell_command(ls_cmd) + exit_code, ret = shell_command(ls_cmd) if len(ret) > 0: time_stamp = ret[0] else: time_stamp = "" if time_stamp == prev_stamp: - query_cnt = query_cnt + 1 + continue else: prev_stamp = time_stamp - query_cnt = 0 + status_cnt += 1 - if query_cnt >= 60: + if status_cnt == 1: + LOGGER.info('[ web uifw begin generating result xml ... ]') + elif status_cnt >= 2: + LOGGER.info('[ web uifw end generating result xml ... ]') result_file = os.path.expanduser( "~") + os.sep + self.test_session + "_uifw.xml" b_ok = _download_file(self.device_id, @@ -393,7 +403,7 @@ class QUTestExecThread(threading.Thread): TEST_SERVER_RESULT = {"resultfile": result_file} LOCK_OBJ.release() break - LOGGER.info('[ uifw test suite completed ... ]') + LOGGER.info('[ web uifw test suite completed ... ]') LOCK_OBJ.acquire() TEST_SERVER_STATUS = {"finished": 1} LOCK_OBJ.release() @@ -426,7 +436,7 @@ class TizenMobile: def get_device_ids(self): """get tizen deivce list of ids""" result = [] - ret = shell_command("sdb devices") + exit_code, ret = shell_command("sdb devices") for line in ret: if str.find(line, "\tdevice\t") != -1: result.append(line.split("\t")[0]) @@ -442,7 +452,7 @@ class TizenMobile: os_version_str = "" # get resolution and screen size - ret = shell_command("sdb -s %s shell xrandr" % deviceid) + exit_code, ret = shell_command("sdb -s %s shell xrandr" % deviceid) pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)") for line in ret: match = pattern.search(line) @@ -450,15 +460,16 @@ class TizenMobile: resolution_str = "%s x %s" % (match.group(1), match.group(2)) screen_size_str = "%s x %s" % (match.group(3), match.group(4)) # get architecture - ret = shell_command("sdb -s %s shell uname -m" % deviceid) + exit_code, ret = shell_command("sdb -s %s shell uname -m" % deviceid) if len(ret) > 0: device_model_str = ret[0] # get hostname - ret = shell_command("sdb -s %s shell uname -n" % deviceid) + exit_code, ret = shell_command("sdb -s %s shell uname -n" % deviceid) if len(ret) > 0: device_name_str = ret[0] # get os version - ret = shell_command("sdb -s %s shell cat /etc/issue" % deviceid) + exit_code, ret = shell_command( + "sdb -s %s shell cat /etc/issue" % deviceid) for line in ret: if len(line) > 1: os_version_str = "%s %s" % (os_version_str, line) @@ -477,15 +488,15 @@ class TizenMobile: filename = os.path.split(pkgpath)[1] devpath = "/tmp/%s" % filename cmd = "sdb -s %s push %s %s" % (deviceid, pkgpath, devpath) - ret = shell_command(cmd) + exit_code, ret = shell_command(cmd) cmd = "sdb shell rpm -ivh %s" % devpath - ret = shell_command(cmd) + exit_code, ret = shell_command(cmd) return ret def get_installed_package(self, deviceid): """get list of installed package from device""" cmd = "sdb -s %s shell rpm -qa | grep tct" % (deviceid) - ret = shell_command(cmd) + exit_code, ret = shell_command(cmd) return ret def download_file(self, deviceid, remote_path, local_path): @@ -507,13 +518,13 @@ class TizenMobile: if self.__test_auto_iu: test_wgt = self.__test_wgt cmd = WRT_INSTALL_STR % (deviceid, test_suite, test_wgt) - ret = shell_command(cmd) + exit_code, ret = shell_command(cmd) else: test_wgt = test_suite # query the whether test widget is installed ok cmd = WRT_QUERY_STR % (deviceid, test_wgt) - ret = shell_command(cmd) + exit_code, ret = shell_command(cmd) if len(ret) == 0: LOGGER.info("[ test widget \"%s\" not installed in target ]" % test_wgt) @@ -583,7 +594,7 @@ class TizenMobile: if self.__test_self_exec: cmdline = WRT_START_STR % (deviceid, test_opt["suite_id"]) while timecnt < 3: - ret = shell_command(cmdline) + exit_code, ret = shell_command(cmdline) if len(ret) > 0 and ret[0].find('launched') != -1: blauched = True break @@ -598,35 +609,40 @@ class TizenMobile: LOGGER.info("[ launch the stub httpserver ]") cmdline = "sdb shell killall %s " % stub_app - ret = shell_command(cmdline) + exit_code, ret = shell_command(cmdline) time.sleep(2) cmdline = "sdb -s %s shell %s --port:%s %s" \ % (deviceid, stub_app, stub_port, debug_opt) self.__test_async_shell = StubExecThread( cmd=cmdline, sessionid=session_id) self.__test_async_shell.start() + time.sleep(2) self.__stub_server_url = _get_forward_connect(deviceid, stub_port) + LOGGER.info("[ Access baseURL: %s ]" % self.__stub_server_url) while timecnt < 10: - time.sleep(1) ret = http_request(get_url( self.__stub_server_url, "/check_server_status"), "GET", {}) if ret is None: LOGGER.info("[ check server status, not ready yet! ]") timecnt += 1 + time.sleep(1) + continue + + if "error_code" in ret: + LOGGER.info("[ check server status, " + "get error code %d ! ]" % ret["error_code"]) + return None else: - if "error_code" in ret: - LOGGER.info("[ check server status, " - "get error code %d ! ]" % ret["error_code"]) - return None - else: - blauched = True - break + blauched = True + break if blauched: ret = http_request(get_url( self.__stub_server_url, "/init_test"), "POST", test_opt) if "error_code" in ret: + LOGGER.info("[ init test suite, " + "get error code %d ! ]" % ret["error_code"]) return None if capability_opt is not None: @@ -677,6 +693,7 @@ class TizenMobile: b_ok = _download_file(self.__device_id, UIFW_RESULT, result_file) + LOGGER.info('[ web uifw test suite result splitting ...]') if b_ok: TEST_SERVER_RESULT = {"resultfile": result_file} TEST_SERVER_STATUS = {"finished": 1} @@ -774,7 +791,7 @@ class TizenMobile: if self.__test_auto_iu: cmd = "sdb -s %s shell wrt-installer -un %s" \ % (self.__device_id, self.__test_wgt) - ret = shell_command(cmd) + exit_code, ret = shell_command(cmd) ret = http_request(get_url( self.__stub_server_url, "/shut_down_server"), "GET", {}) diff --git a/commodule/log.py b/commodule/log.py index 9757731..73ac67f 100644 --- a/commodule/log.py +++ b/commodule/log.py @@ -78,7 +78,6 @@ class Logger: def info(self, msg): """info level message""" if msg is not None: - # self._logger.info(msg) sys.stdout.write(msg + '\r\n') sys.stdout.flush() diff --git a/requests/__init__.py b/requests/__init__.py new file mode 100644 index 0000000..1ea4aff --- /dev/null +++ b/requests/__init__.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- + +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +requests HTTP library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. Basic GET +usage: + + >>> import requests + >>> r = requests.get('http://python.org') + >>> r.status_code + 200 + >>> 'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post("http://httpbin.org/post", data=payload) + >>> print r.text + { + ... + "form": { + "key2": "value2", + "key1": "value1" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at . + +:copyright: (c) 2013 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. + +""" + +__title__ = 'requests' +__version__ = '1.2.0' +__build__ = 0x010200 +__author__ = 'Kenneth Reitz' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2013 Kenneth Reitz' + + +from . import utils +from .models import Request, Response, PreparedRequest +from .api import request, get, head, post, patch, put, delete, options +from .sessions import session, Session +from .status_codes import codes +from .exceptions import ( + RequestException, Timeout, URLRequired, + TooManyRedirects, HTTPError, ConnectionError +) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +logging.getLogger(__name__).addHandler(NullHandler()) diff --git a/requests/__init__.pyc b/requests/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ceb53d7a49d492b155e01762162591c822175ff7 GIT binary patch literal 2375 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. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of 'name': file-like-objects (or {'name': ('filename', fileobj)}) for multipart encoding upload. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) Float describing the timeout of the request. + :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed. + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'http://httpbin.org/get') + + """ + + session = sessions.Session() + return session.request(method=method, url=url, **kwargs) + + +def get(url, **kwargs): + """Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', True) + return request('get', url, **kwargs) + + +def options(url, **kwargs): + """Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', True) + return request('options', url, **kwargs) + + +def head(url, **kwargs): + """Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, **kwargs): + """Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return request('post', url, data=data, **kwargs) + + +def put(url, data=None, **kwargs): + """Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + """Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return request('patch', url, data=data, **kwargs) + + +def delete(url, **kwargs): + """Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return request('delete', url, **kwargs) diff --git a/requests/api.pyc b/requests/api.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3be8ae3f9c951b9a6d26c307b3e86ffc05d5608 GIT binary patch literal 5270 zcmeHL&2HO95MD`%f8?}Hd*~sDVlRcHKoJx7Mx;U&S*hI^woAzKqPQA;?BQGhvCvC(TdWv-Nvp>h$p3vjK# zbq6~>hei`}Tp&La@}xu_m&kDu!F&vm7Rh4}isTt7cB>^+zXAi>U`WS_3rk|52Qvvh zkf`nYOewpcEs@^Lgl4}{rtopNPU29_>8S`Taa2sDW}nKzF?TgA07uvni&;PeKtg(U z_G?y)P=@?;&Xyr#Hhyk+68knibar2Opz*GN7#V2*kNGvaC0rxM6AG9QCYl4Sk`6ec zps5HA$uJjC0E|R9ntEM=Cj%v0qQ^9Qj-z_&rj8DW!spj~al$j4&^N-LJ03_6CN?ya zIM?5pGmpp5U)zvw_j(6(J5`&yITf%c5&LtEyHcJAe%3gypl$lTVe#?`{-0?C;H+UJ z2N@aCO2`6Uv1dSCOE;7P5@Y&f-d(MrA){M2x}a5iQcDj~;%foaYsy1cdPrds`I33* zF3t#Ji5@Qy)`A;UgC<9`!1e&7TTBVp+7crO6jnP?S_UbwsJ&oMi-5}nqrhyl-3G53 z&a`r4F~E5s@|j}Jau$UaY%$-Lr$;gOL=0zX5w2TO`kaLg+T|K2+KUs2QA2vL-|blk zhdpbnv)k!)Xg(SsL2Kw8Vw$nc7mv+eim#z42bOI;2$oeJN_6KDnrm>q4=cI)WY;ojD6heix|aajm+ zSLUFCw@1QTS_GU`&VsWJZ^Njm$2bd9)Rm#e%Pg&HV}W-y1vRN4JQCe+8Jg7D3&XD$SchzaNg1wbGt(@>lr3S-AoCVB7#YWt= z)96WQv)RP_BLSprpC}Vo(;m1*znpe7GL35G>rM}ikF}0$%fcVnd<_|otP$6hT4rGy zwCTOg>(?JN&25coB@Nda(*=ZHlQtZXiC%@KnU1Ihd*(%udF}$tjCR%4lV& zs|sDjH0lOO)>sDI@>m#7tX{hZK~eK--+j@Z{;~2ETacd{(ZoS7AH$_kAXhFGTy&Y| zLz4?B+<=64Y>EjD84=0|4apGFpy_y4gbKi*gD@U>M+$1;4O!JxTrBl=W ztM{*_7}<0`%T5#^OY%ws0!P1}LD270%}zL!1(+4}M=l*oN!15b!$~$_d!+w6@+o^l`IeaWsQo<32Ze;Emvq4-_4^X87X? z!yq#)(LaShP@*r_j`ilf~5nv6w*r8%mdg9v0IsE_wYTr<8x9Q0vjdTLHgb>ub08aJ-A+)*V;Uo25lrrxo-ig`}bB@P- zuKC>YdCeu?C*b2DVr3%Y>YjP0X3CzUBTu?VM}RCuU(;Z;cCbctuugF>S(ijseiv&p&XQd#BfMT)YuEeF6 zyUflqvJ0{obP77GWx0D|J!KhpXefyee{k*uB49aV_?Uw?7QP}MfNM>aaH!KI<81M zBi)+p*Tjhcnvrx?x^uEWC*8X2*DbUrX+yeaWdDpfaaB6=5--So9CTKqS=nEd2s@S} zs>?4x$+AQZiO8B?JO^ml>!qWkx9)BnA0Kbv-0lX@SoD!u!K!XQEfXLpxAbcimSKxW zvdy4vqnVe`LCz(5R|X;jM-E+C>wxVQN(X-(m(1@#?h0AoZC1JSX>@*E_6x8i^xg?g z((-PAEgmkAWJjB(h6NUEc-%$v`bAR`n1X59WyRuSDhjlemt08%Jq1QFxi!To6Bk+7 zjg@P?(3s=Ah?>Nqop~9ft#;mxx1uo1?rrUD?`@<>8E<_0%JyWkH5U06rMTI1m8h3>*!)=EI5W4j;kI^-qYUK)3yN~%c4gNTzaV(+lXyAxrN3>DTA29%VF<>z{!J!40uq1JLXK^kvbm7-eg5;fm&!Vk~^ieqmuK8De-x&DHvuCXC79NNtTpB@B<)I28vU6 zCK^hbxB10G2MqzVmnNObQMe@E{r^%y{lgC zEEb(;#RHnX>eePOjqdZb)1>$DX=Og0ug@squd;iDYDgO-?dl()hEBaYQN-Ite)rz# ziukQ==1t)Iy8bCP^~rG-Phu4mF!WAWKdK$u1Bg>2jvl!2twQyw)sID*uLALjG->DG zl;$H8Bqj37_&^G>q*~JQZze}bDNdIoL)8CwC2PVCq6R#Hpq;aYX9U5$?($ z%d=Ko()a2pXyyH^EGe2+J4_#o!%~yIjuQ->2_2RFRrgA%F~E?1^A9kAUP@!?g<)kp zapl6WI+{#Uq2bIFq{_@_Set^(C}dU!H8SYVoD{J{H5txHHcuct;C= z^M$O3bs5yOEJ$ZYhG%t9lcMSjkZ+$EP1mpDO9mvM5NrVPmIZTiSdq0Ma&lmRBAnHvaJVD` zXysX@ZrvSN4%KzK?*Kuy(~xLUuDU@(vO0$VVvIzb=o>(}EYJlzVQM)q(Xvu{P6qhX zXMu%W9V!T}v2#}Q&+*dnhehe&wQ!ER2`ZPRqdSOpg*&1Z@rHOYtP<~FSq3X4A1oUz zans=p$iX+|;$V@W!78KG@VsQ#^rn`z@4M4$$dT$479`7~J=QQRR|4Gr{1i_?07P)! z9=axjSt)+&4)7S!@!Hkl8pQxDDgLD3b&eA3n>$2>~d(_A!uYd=_WXIp^r< zyYJq3%$)GQi(^mj@4tYldP>s{FZLUhMHuZPD<>wXZHQA()P)b2xas5JdKz{QqVP>V;tiTT z@GUckp^}2v=G42BHwlq#>dRYGgo`g-yQ>RS6%+1DnEDw;@i7Jlt#DX;aqlGa z_MgNGpWfp{BXvWW;QdWREgezTxlvo~7bt_|UDaEk4+X2UjJWzHQQv~i?L1P_P_OX6 z!;ie8|13L?-E-*dn{dJ$pZemz$PYa5{hOnjK?zRTVnCp!lE`NYsB3Oqw*OvM+OpOc zVcL)VOZ-f?WBI3hm6HcasSAtP^oW!SbAVU7Dyp@+O@JO$WobnR{UnW0%wcjkD(7qy zcsWyXszWmH>fka_iXlgtOvYa8>|)7UOxR zS*g19N(Hc*vpm(-T{Udpp6z`!^DlJPmD_6H{faORg3HDq96FwDNOcetwXVkit!d01 zM5?ctEijWowcsmFI;?{L(3N!{a-b&MfrMywga$r?DFG4HnBHfb;B zb#!~-9X!@ga%BpiChI|wJyfCa(TZ!s+Fo+#WpNzE(WXAxvVJ$X^3r9kaTx1aXw)po zasBAkANv=`WU|~MOQ^zzN$5@01dDhQJe%d*gClF#>onp>J5$Ax}Jp-{h9 z#v6*bmxc(PYV^d*S|v_bD=Wg|avrcEPGjgZ67VeZ-#yu?h6!{J^W`N z)`%!>-FY5v!jeWM{bq$jDJ3C~vexkg@X^lnA*QvC+4@fXLQ_M6R#$$=6R)z2+J^%^?Io?xk04Pfu$M#1% zd$)G>g1ygf-wJ;Gk^f=viT}Z^o$Zfq-nv!aF1c&YQf1KvGb{Dl+U(kywb}myrvx!b literal 0 HcmV?d00001 diff --git a/requests/cacert.pem b/requests/cacert.pem new file mode 100644 index 0000000..504fdcc --- /dev/null +++ b/requests/cacert.pem @@ -0,0 +1,3290 @@ +## +## ca-bundle.crt -- Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Wed Jan 18 00:04:16 2012 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## + +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (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.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is the Netscape security libraries. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1994-2000 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** +# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.81 $ $Date: 2012/01/17 22:02:37 $ + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 1 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy +MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE +NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i +o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq +kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 +RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 3 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy +MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD +VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS +xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi +up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 +mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC +AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER +gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS +o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z +2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX +OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 2 +============================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE +ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT +DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn +2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 +BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx +JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e +uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 +jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia +78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm +V+GRMOrN +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Firmaprofesional Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT +GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp +Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA +ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL +MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT +OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 +ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V +j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH +lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf +3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 +NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww +KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG +AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD +ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf +wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm +7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG +VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= +-----END CERTIFICATE----- + +Wells Fargo Root CA +=================== +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl +bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv +MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX +x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 +E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 +OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j +sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj +YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF +BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD +ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv +m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R +OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 +tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +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 +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. +====================================== +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT +AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg +LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w +HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ +U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh +IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN +yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU +2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 +4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP +2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm +8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf +HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa +Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK +5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b +czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g +ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF +BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug +cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf +AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX +EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v +/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 +MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 +3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk +eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f +/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h +RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU +Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 2 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw +MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw +IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 +xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ +Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u +SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G +dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ +KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj +TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP +JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk +vQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 3 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw +MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W +yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo +6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ +uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk +2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE +O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 +yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 +IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal +092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc +5A== +-----END CERTIFICATE----- + +TC TrustCenter Universal CA I +============================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN +MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg +VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw +JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC +qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv +xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw +ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O +gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j +BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG +1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy +vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 +ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a +7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +ComSign Secured CA +================== +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE +AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w +NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD +QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs +49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH +7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB +kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 +9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw +AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t +U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA +j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC +AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a +BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp +FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP +51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +Buypass Class 3 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 +MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx +ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 +n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia +AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c +1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 +pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA +EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 +htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj +el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +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 +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi +=================================================== +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz +ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 +MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 +cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u +aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY +8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y +jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI +JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk +9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG +SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d +F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq +D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 +Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +TC TrustCenter Universal CA III +=============================== +-----BEGIN CERTIFICATE----- +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe +Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU +QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex +KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt +QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO +juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut +CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 +M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G +A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA +g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ +KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK +BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq +woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +A-Trust-nQual-03 +================ +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE +Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy +a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R +dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw +RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 +ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 +c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA +zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n +yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE +SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 +iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V +cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV +eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 +ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr +sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd +JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 +ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- diff --git a/requests/certs.py b/requests/certs.py new file mode 100644 index 0000000..bc00826 --- /dev/null +++ b/requests/certs.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +certs.py +~~~~~~~~ + +This module returns the preferred default CA certificate bundle. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" + +import os.path + + +def where(): + """Return the preferred certificate bundle.""" + # vendored bundle inside Requests + return os.path.join(os.path.dirname(__file__), 'cacert.pem') + +if __name__ == '__main__': + print(where()) diff --git a/requests/certs.pyc b/requests/certs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2701eb8a9cf1d79123faa6cc7eb3e85a0a0aa2a6 GIT binary patch literal 789 zcmb`F&5qMB5XUD;mk(?A!V56RB6Smql{g^;>H&}t5~UK-ULtQiN!(5BVmk}Ha4E0A zTk!@w1`hz^G+iXb5lfkjC-d>k-_CxXiSIwYy{lkaDZiidxp zmK@C=VXzZ9Pw=#rj`6ykIKc1^F!&Kx|Kj!bR^5!1Sw?jpvIzj21UBi>$so*N&tfOA zk21!i@N+h+QKr9C`iC@LaB?N%mwZe8cn%?Uv7S2vY-MOiXJfSqcR8Z8GqR^}kNvW& zbw_0xC&C}&FL+zDwx>c#V|K-Qxjyf7pz{wG%iB%iCjE=!k%xE-M#Ubm<0A%S)1Y2z y!-HbRh*6fxR%JQ*mhTI5u44Xb%s9YB&i@A&dpNzu3f literal 0 HcmV?d00001 diff --git a/requests/compat.py b/requests/compat.py new file mode 100644 index 0000000..bcf94b0 --- /dev/null +++ b/requests/compat.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- + +""" +pythoncompat +""" + +from .packages import charade as chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +#: Python 3.0.x +is_py30 = (is_py3 and _ver[1] == 0) + +#: Python 3.1.x +is_py31 = (is_py3 and _ver[1] == 1) + +#: Python 3.2.x +is_py32 = (is_py3 and _ver[1] == 2) + +#: Python 3.3.x +is_py33 = (is_py3 and _ver[1] == 3) + +#: Python 3.4.x +is_py34 = (is_py3 and _ver[1] == 4) + +#: Python 2.7.x +is_py27 = (is_py2 and _ver[1] == 7) + +#: Python 2.6.x +is_py26 = (is_py2 and _ver[1] == 6) + +#: Python 2.5.x +is_py25 = (is_py2 and _ver[1] == 5) + +#: Python 2.4.x +is_py24 = (is_py2 and _ver[1] == 4) # I'm assuming this is not by choice. + + +# --------- +# Platforms +# --------- + + +# Syntax sugar. +_ver = sys.version.lower() + +is_pypy = ('pypy' in _ver) +is_jython = ('jython' in _ver) +is_ironpython = ('iron' in _ver) + +# Assume CPython, if nothing else. +is_cpython = not any((is_pypy, is_jython, is_ironpython)) + +# Windows-based system. +is_windows = 'win32' in str(sys.platform).lower() + +# Standard Linux 2+ system. +is_linux = ('linux' in str(sys.platform).lower()) +is_osx = ('darwin' in str(sys.platform).lower()) +is_hpux = ('hpux' in str(sys.platform).lower()) # Complete guess. +is_solaris = ('solar==' in str(sys.platform).lower()) # Complete guess. + +try: + import simplejson as json +except ImportError: + import json + +# --------- +# Specifics +# --------- + +if is_py2: + from urllib import quote, unquote, quote_plus, unquote_plus, urlencode + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag + from urllib2 import parse_http_list + import cookielib + from Cookie import Morsel + from StringIO import StringIO + from .packages.urllib3.packages.ordered_dict import OrderedDict + + builtin_str = str + bytes = str + str = unicode + basestring = basestring + numeric_types = (int, long, float) + + +elif is_py3: + from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag + from urllib.request import parse_http_list + from http import cookiejar as cookielib + from http.cookies import Morsel + from io import StringIO + from collections import OrderedDict + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) diff --git a/requests/compat.pyc b/requests/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5a54fe519bedea89f4a37452ae29781cc89bab0 GIT binary patch literal 2411 zcmZ`(OLH4V5bl*^*_L05Uy0)c2qcd3u;oa0Odt*cCsgGCDK@DJH3zoVnvuQo?9OI) zgspRK+_`h&zz^U*P?di`ap5m;;RfA3vLu47DYs|7?&;~r*IWE+rtO zALC#COA$Z<2$UYk0%#B70*E4bvIw#Sx&)#Gssx=e5M@whkYlhS%W#BN>~ zfccJ553R-+on+JwP><0HqdyE#=W&YBp9ZM&JI&~?19XBt%zzpP^LBtvGCIrXp98eQ z=p3Ve56~$_tBlTiloiG6{9fR6=b^IzZ?H0`!}l?~GKfWx_^R74fyB4mei_t7P>Z0J zKrKVN2yZ-?7MDQcyDRMOGC|HGIa&pYkDsZ!0um!QQ*{;O{5h)kKrWo4dLMdK=y&r2 z5ZB;UaurJILpZ8HRxNnmX{)c1GV$PBtZVj1fvzlq{s`jhAg)7v1H=u8*Fda6d=tb? zh-)Bfjwnl@Z$W$u1j^eWZbN(r#2tw5g18IuI*4^=w+wm%;yQ@>fMA;-HaWbDpzlH4 z0MT%|OQ4$&H$gPWnK%t?CGrrek+9<^T8Cj4N)`Qszpo<% zAS#f+S%;`Zf~=x4i7^zGu(XFR3F@$C#-hw5mMo5=q}kw|j*{*P+sQCPnC%YJ?nzEQ zbECs-celn~NxbeFt2n4`;`WtOG)Q$fx6^p+s~j*%K&BPuCY5tE;h;3ka%Jg0>br?M z(yMsv7!0Lvm!~?iw(m!(b`~DE+RULX-wF<`O#>a})+s3MuMB$E?o5te*eps8o;`QS z6e7L@isRDEt``)D53J`&AN@k5Bh~3czPOy6j&-;e3&zWz12eI$>6OiYG2m z5J=Ms0?r~0TSwu6%6(K0dn%Q+)Wf{z>h`_L^2j7Xl(Y@^AwYzC6XikLYYewdeu2^E z=E(lu$i6YMAGO~a;*Fh={r!>s_Q>AZ_hWOMF~=AebB^Ldo>2)fnm*O2j(8%rIa+g; zVbbGfqoy?i=QeXC(xGjeEIzeCE=qHpvktEed5Q;(Al@wVvO1mmB^(0Ye&~L-xJLr0^F|>o1bY z8j4dYY`DwKjR9aB9|MVm^q0t<0^aXN+D1u0b)pH}?^%_**OQ25iqqW>b3}>ZTx%R2 zPFouU=vG^s&{|3+>BcIHT7m7Qc!S54OMr3EI1>F`WE+`!-9;1kMZf{`mr=(zXxug& z<#WrQBEzw^jMl1Uk;8cnZDA<#Ej-o_O|0rNOp;#x<=)G69BZ}ys<}5f)ca57b@w6M zK%UU-J&cX)YW0XR$vY^@g=%4Xe6m=@wfydyoGVOwxDa10u6n!*MX&13c-3;*tKq7m VzDlc5_S~8;mc1_>HiA!k{{r7M^*{gs literal 0 HcmV?d00001 diff --git a/requests/cookies.py b/requests/cookies.py new file mode 100644 index 0000000..1235711 --- /dev/null +++ b/requests/cookies.py @@ -0,0 +1,385 @@ +# -*- coding: utf-8 -*- + +""" +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import collections +from .compat import cookielib, urlparse, Morsel + +try: + import threading + # grr, pyflakes: this fixes "redefinition of unused 'threading'" + threading +except ImportError: + import dummy_threading as threading + + +class MockRequest(object): + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + return self._r.url + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + +class MockResponse(object): + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """Produce an appropriate Cookie header string to be sent with `request`, or None.""" + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get('Cookie') + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name == name: + if domain is None or domain == cookie.domain: + if path is None or path == cookie.path: + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific.""" + + +class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Don't use the dict interface internally; it's just for compatibility with + with external client code. All `requests` code should work out of the box + with externally provided instances of CookieJar, e.g., LWPCookieJar and + FileCookieJar. + + Caution: dictionary operations that are normally O(1) may be O(n). + + Unlike a regular CookieJar, this class is pickleable. + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. Caution: operation is O(n), not O(1).""" + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains.""" + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the jar. + See values() and items().""" + keys = [] + for cookie in iter(self): + keys.append(cookie.name) + return keys + + def values(self): + """Dict-like values() that returns a list of values of cookies from the jar. + See keys() and items().""" + values = [] + for cookie in iter(self): + values.append(cookie.value) + return values + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the jar. + See keys() and values(). Allows client-code to call "dict(RequestsCookieJar) + and get a vanilla python dict of key value pairs.""" + items = [] + for cookie in iter(self): + items.append((cookie.name, cookie.value)) + return items + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise.""" + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain old + Python dict of name-value pairs of cookies that meet the requirements.""" + dictionary = {} + for cookie in iter(self): + if (domain is None or cookie.domain == domain) and (path is None + or cookie.path == path): + dictionary[cookie.name] = cookie.value + return dictionary + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws exception + if there are more than one cookie with name. In that case, use the more + explicit get() method instead. Caution: operation is O(n), not O(1).""" + + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws exception + if there is already a cookie of that name in the jar. In that case, use the more + explicit set() method instead.""" + + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps cookielib.CookieJar's remove_cookie_by_name().""" + remove_cookie_by_name(self, name) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(cookie) + else: + super(RequestsCookieJar, self).update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. Takes as args name + and optional domain and path. Returns a cookie.value. If there are conflicting cookies, + _find arbitrarily chooses one. See _find_no_duplicates if you want an exception thrown + if there are conflicting cookies.""" + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def _find_no_duplicates(self, name, domain=None, path=None): + """__get_item__ and get call _find_no_duplicates -- never used in Requests internally. + Takes as args name and optional domain and path. Returns a cookie.value. + Throws KeyError if cookie is not found and CookieConflictError if there are + multiple cookies that match name and optionally domain and path.""" + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: # if there are multiple cookies that meet passed in criteria + raise CookieConflictError('There are multiple cookies with name, %r' % (name)) + toReturn = cookie.value # we will eventually return this as long as no cookie conflict + + if toReturn: + return toReturn + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop('_cookies_lock') + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if '_cookies_lock' not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.update(self) + return new_cj + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = dict( + version=0, + name=name, + value=value, + port=None, + domain='', + path='/', + secure=False, + expires=None, + discard=True, + comment=None, + comment_url=None, + rest={'HttpOnly': None}, + rfc2109=False,) + + badargs = set(kwargs) - set(result) + if badargs: + err = 'create_cookie() got unexpected keyword arguments: %s' + raise TypeError(err % list(badargs)) + + result.update(kwargs) + result['port_specified'] = bool(result['port']) + result['domain_specified'] = bool(result['domain']) + result['domain_initial_dot'] = result['domain'].startswith('.') + result['path_specified'] = bool(result['path']) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + c = create_cookie( + name=morsel.key, + value=morsel.value, + version=morsel['version'] or 0, + port=None, + port_specified=False, + domain=morsel['domain'], + domain_specified=bool(morsel['domain']), + domain_initial_dot=morsel['domain'].startswith('.'), + path=morsel['path'], + path_specified=bool(morsel['path']), + secure=bool(morsel['secure']), + expires=morsel['max-age'] or morsel['expires'], + discard=False, + comment=morsel['comment'], + comment_url=bool(morsel['comment']), + rest={'HttpOnly': morsel['httponly']}, + rfc2109=False,) + return c + + +def cookiejar_from_dict(cookie_dict, cookiejar=None): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + for name in cookie_dict: + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + return cookiejar diff --git a/requests/cookies.pyc b/requests/cookies.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30cfb6562933e6f0c5d325f43aaa3b12d75b83da GIT binary patch literal 17335 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 PbMxcR|K;R2CeQpI8?*-V literal 0 HcmV?d00001 diff --git a/requests/exceptions.py b/requests/exceptions.py new file mode 100644 index 0000000..c0588f6 --- /dev/null +++ b/requests/exceptions.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. + +""" + + +class RequestException(RuntimeError): + """There was an ambiguous exception that occurred while handling your + request.""" + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + def __init__(self, *args, **kwargs): + """ Initializes HTTPError with optional `response` object. """ + self.response = kwargs.pop('response', None) + super(HTTPError, self).__init__(*args, **kwargs) + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL schema (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """See defaults.py for valid schemas.""" + + +class InvalidURL(RequestException, ValueError): + """ The URL provided was somehow invalid. """ diff --git a/requests/exceptions.pyc b/requests/exceptions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0236e523c09375ac72772df32f8e016330ffaaf GIT binary patch literal 3061 zcmcguUvJws5I@O(k|;_4H$#VEIP78d22=)GVCX|JGz$u>K$~r{x1o7)S&@#E+N38^ z^;`sd>7MttZ?$i*53z@Rf!)!TY@{fbV(}#KL>|ez``w+6Z2Y|&{qg7T-=(m48uWcg z&HhD10vr(yKm{-iK!)%uz#D*PMRdL%jw+V6sRMW5Bthp_aTh-dA z=C(m@SKOVNy8&{y;$Et`n;jT$<7@)sPi} zOi0tRD3ru$mXnE@&~lXPW1N|?h>)HI(zwHscbh~811-jCFmRC{%)!xc!w;oN2ZIiE zVM*+L8g?@?R$VEyo^|^N{X3)FsXIU3JE#ZU%BkHIS4?IJ%i5u4Ln7_aZPDlJe*fD? zMPZ7!eewZKulj`2ld|%t!Omd`mKW@6WD%%XM(u<+W$!UiZtO&Rm&j=dCqB(7!QX^% zN-hY&HNZ8wPn?q$oCdt?H-LZ^^}Mq@YJ9A7my1#UT3N5sTaDA)WoUfjh!H+7l$}rt zspn{3oT${r=sjJr4?Ar#gERt6Xj7BEheoTU#at$~oTwsU{vtv-X{9jm4!_*0(a?89 zacmt+dpYIqMa76?a)X*>8z8(HbhwkSI}>(#!j>ewYN^rp{#$CWlB?9b+IB$6ahXO3 zMr(2+{gm%Wk$3$zAJOK0Ty8&`9^Rj4KwT)FT{7T9#^X~x@WJf$p1davE>o1?wDErj zz@Ghh1pwECem+*FbSZWH^RLy5?WgKhl^%2?Kq85l7ol|qfYav_YE=NXssDZQge!4Q zRr358KBtZQ_=e12_&E7=1s9L|#yk~zmMBS9rOuuo z-1YfxLZN4bVX=SxDEL=r$5zqd-{om;Ege|BG*e@7eh6KLKsm;-v3@UhRD2v`=G+A7 zOyIBmjN>+*Ygj+LYh+V=2Hs=sbLf5HaSr#CLaBzL9ML^xGQ%OEnkVEOuw6eQP82>t ztAO#1VS$JofBtCQrhQn2Yf_k3x#TMg-EAygDl#+0eD0?h*IuLfnEPUh>9E6D=+8ID zx0IyRT(5k|_E#5wEGK>uSI2})OyaM1oX-9d^@A9diyfQ;3A-&}Jr{Yn_`~GE{I>Qb WpTw3mv>SV^y{)}w_1}2MfN%*4`ef$39O-h?3@O^<}A46nB7m$L+ zf-VGQ0eu1zP!@V6q^w5$c#GY?LPV9mzR}j%&cv9hjXwOfqG&M5t(=?eW~OCXnMIyy zE8RrPRF&!~pXDwGFfx?~dz)a=2a|Sbot}51=;cD?Gj)X+-mo7*$xUR$a`%z;oulU<08qm@#PJ;DL@T2A56KZ7UGC5dY!KaI z3p%)N(K*z9%(R_)>6nh!XJ^O#m}B{?PtrbvIK*vFr{G2fN@w z@1E}+{=RhYc!ei;?UYN`!n;h5)XmH#9((}6ay2CCq9wLP8bYt*a6ZR4_9Fz6E}LA+ z8fA%18PhsdD>l9L$Xc+;1&pBg>wv0PtYZj(7a-#)Uym-I(5gna*l-Q$Gt66byTxNN zZBTW>`YNF76W-@|2fu#IY1wBGN4YJPODAZ#@~xCvp1Rx=s#;1@037FFOP0A#wKOA{ zDW^KVV@Z;#*(^y;V{VmW!EYVM9&6|B;X6@QIahh(sVQ{KTzHSEUiN%z8teu}6OQcI zK7FUEvGs4*;38n2U+?n2`nD`E39I literal 0 HcmV?d00001 diff --git a/requests/models.py b/requests/models.py new file mode 100644 index 0000000..6ed2b59 --- /dev/null +++ b/requests/models.py @@ -0,0 +1,673 @@ +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import collections +import logging +import datetime + +from io import BytesIO +from .hooks import default_hooks +from .structures import CaseInsensitiveDict + +from .auth import HTTPBasicAuth +from .cookies import cookiejar_from_dict, get_cookie_header +from .packages.urllib3.filepost import encode_multipart_formdata +from .exceptions import HTTPError, RequestException, MissingSchema, InvalidURL +from .utils import ( + stream_untransfer, guess_filename, get_auth_from_url, requote_uri, + stream_decode_response_unicode, to_key_val_list, parse_header_links, + iter_slices, guess_json_utf, super_len) +from .compat import ( + cookielib, urlparse, urlunparse, urlsplit, urlencode, str, bytes, StringIO, + is_py2, chardet, json, builtin_str, basestring) + +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + +log = logging.getLogger(__name__) + + +class RequestEncodingMixin(object): + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = '/' + + url.append(path) + + query = p.query + if query: + url.append('?') + url.append(query) + + return ''.join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but abritrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, 'read'): + return data + elif hasattr(data, '__iter__'): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): + vs = [vs] + for v in vs: + if v is not None: + result.append( + (k.encode('utf-8') if isinstance(k, str) else k, + v.encode('utf-8') if isinstance(v, str) else v)) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but abritrary + if parameters are supplied as a dict. + + """ + if (not files) or isinstance(data, str): + return None + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, list): + for v in val: + new_fields.append((field, builtin_str(v))) + else: + new_fields.append((field, builtin_str(val))) + + for (k, v) in files: + # support for explicit filename + ft = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + else: + fn, fp, ft = v + else: + fn = guess_filename(v) or k + fp = v + if isinstance(fp, str): + fp = StringIO(fp) + if isinstance(fp, bytes): + fp = BytesIO(fp) + + if ft: + new_v = (fn, fp.read(), ft) + else: + new_v = (fn, fp.read()) + new_fields.append((k, new_v)) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin(object): + def register_hook(self, event, hook): + """Properly register a hook.""" + + if isinstance(hook, collections.Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request ` object. + + Used to prepare a :class:`PreparedRequest `, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach the request. If a dictionary is provided, form-encoding will take place. + :param params: dictionary of URL parameters to append to the URL. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req.prepare() + + + """ + def __init__(self, + method=None, + url=None, + headers=None, + files=None, + data=dict(), + params=dict(), + auth=None, + cookies=None, + hooks=None): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.params = params + self.auth = auth + self.cookies = cookies + self.hooks = hooks + + def __repr__(self): + return '' % (self.method) + + def prepare(self): + """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" + p = PreparedRequest() + + p.prepare_method(self.method) + p.prepare_url(self.url, self.params) + p.prepare_headers(self.headers) + p.prepare_cookies(self.cookies) + p.prepare_body(self.data, self.files) + p.prepare_auth(self.auth, self.url) + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + p.prepare_hooks(self.hooks) + + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest ` object, + containing the exact bytes that will be sent to the server. + + Generated from either a :class:`Request ` object or manually. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> r = req.prepare() + + + >>> s = requests.Session() + >>> s.send(r) + + + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + + def __repr__(self): + return '' % (self.method) + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = self.method.upper() + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + try: + url = unicode(url) + except NameError: + # We're on Python 3. + url = str(url) + except UnicodeDecodeError: + pass + + # Support for unicode domain names and paths. + scheme, netloc, path, _params, query, fragment = urlparse(url) + + if not (scheme and netloc): + raise MissingSchema("Invalid URL %r: No schema supplied" % url) + + try: + netloc = netloc.encode('idna').decode('utf-8') + except UnicodeError: + raise InvalidURL('URL has an invalid label.') + + # Bare domains aren't valid URLs. + if not path: + path = '/' + + if is_py2: + if isinstance(scheme, str): + scheme = scheme.encode('utf-8') + if isinstance(netloc, str): + netloc = netloc.encode('utf-8') + if isinstance(path, str): + path = path.encode('utf-8') + if isinstance(_params, str): + _params = _params.encode('utf-8') + if isinstance(query, str): + query = query.encode('utf-8') + if isinstance(fragment, str): + fragment = fragment.encode('utf-8') + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = '%s&%s' % (query, enc_params) + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, _params, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + if headers: + headers = dict((name.encode('ascii'), value) for name, value in headers.items()) + self.headers = CaseInsensitiveDict(headers) + else: + self.headers = CaseInsensitiveDict() + + def prepare_body(self, data, files): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + length = None + is_stream = False + + is_stream = all([ + hasattr(data, '__iter__'), + not isinstance(data, basestring), + not isinstance(data, list), + not isinstance(data, dict) + ]) + + try: + length = super_len(data) + except (TypeError, AttributeError): + length = False + + if is_stream: + body = data + + if files: + raise NotImplementedError('Streamed bodies and files are mutually exclusive.') + + if length: + self.headers['Content-Length'] = str(length) + else: + self.headers['Transfer-Encoding'] = 'chunked' + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, str) or isinstance(data, builtin_str) or hasattr(data, 'read'): + content_type = None + else: + content_type = 'application/x-www-form-urlencoded' + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if (content_type) and (not 'content-type' in self.headers): + self.headers['Content-Type'] = content_type + + self.body = body + + def prepare_content_length(self, body): + if hasattr(body, 'seek') and hasattr(body, 'tell'): + body.seek(0, 2) + self.headers['Content-Length'] = str(body.tell()) + body.seek(0, 0) + elif body is not None: + l = super_len(body) + if l: + self.headers['Content-Length'] = str(l) + elif self.method not in ('GET', 'HEAD'): + self.headers['Content-Length'] = '0' + + def prepare_auth(self, auth, url=''): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data.""" + + if isinstance(cookies, cookielib.CookieJar): + cookies = cookies + else: + cookies = cookiejar_from_dict(cookies) + + if 'cookie' not in self.headers: + cookie_header = get_cookie_header(cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response(object): + """The :class:`Response ` object, which contains a + server's response to an HTTP request. + """ + + def __init__(self): + super(Response, self).__init__() + + self._content = False + self._content_consumed = False + + #: Integer Code of responded HTTP Status. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Requires that ``stream=True` on the request. + # This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response ` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta) + self.elapsed = datetime.timedelta(0) + + def __repr__(self): + return '' % (self.status_code) + + def __bool__(self): + """Returns true if :attr:`status_code` is 'OK'.""" + return self.ok + + def __nonzero__(self): + """Returns true if :attr:`status_code` is 'OK'.""" + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + try: + self.raise_for_status() + except RequestException: + return False + return True + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the lovely Charade library + (Thanks, Ian!).""" + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + """ + if self._content_consumed: + # simulate reading small chunks of the content + return iter_slices(self._content, chunk_size) + + def generate(): + while 1: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + self._content_consumed = True + + gen = stream_untransfer(generate(), self) + + if decode_unicode: + gen = stream_decode_response_unicode(gen, self) + + return gen + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, + decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + try: + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code is 0: + self._content = None + else: + self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() + + except AttributeError: + self._content = None + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + if Response.encoding is None and chardet module is available, encoding + will be guessed. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + """Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + """ + + if not self.encoding and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + return json.loads(self.content.decode(encoding), **kwargs) + return json.loads(self.text or self.content, **kwargs) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers['link'] + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises stored :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + + if 400 <= self.status_code < 500: + http_error_msg = '%s Client Error: %s' % (self.status_code, self.reason) + + elif 500 <= self.status_code < 600: + http_error_msg = '%s Server Error: %s' % (self.status_code, self.reason) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + return self.raw.release_conn() diff --git a/requests/models.pyc b/requests/models.pyc new file mode 100644 index 0000000000000000000000000000000000000000..348a9df75a614070f250eb25e2d7c3b885f939f4 GIT binary patch literal 19907 zcmd5^U2GiJb-uH^TyiN=q(qCBY{?oamPN@V<=Bqnu(A@1Qf$RGqCnB2FMTOcpgs?{{ejLKRd=WjHx1Z zOrv0$j;SJ}`GTnyvV750i;^#zX34brOtsHAjgo2fnP%Cv`c1W8%VpCXFs+KIROl#OwhfQmzsqWO;ifN9R)~KnDYI)E!cbV31Q{8P^W2QQ0T6dW0 z9j3L%RQG6)9i};MT6dc2ou;+dRQH$X}PBA>MTR1dC0U5o9bcHdY7rb%e3w_)q73rh^Zbit@}*%KGQmCsz*(0 z!c-?r>zJt?Gp*yMdfc?`H`V)1YtmFFO>4?jr%Y?wRHrd7mT2gp{Sm!5hr+qDmT`!w-F#I8Y<|cqsCh13VdLs$!x$_|_ zw00P|MzHL6n@Mf8-Cna=J%;L8-v;L*8$>ot!mGiVu%7hBJh`y&>}lVI^~bx(>O=wE z6OO54iZHnB$F=3S-KsS(CfSAhl_05UTWvM)8$qly?L$)#)v@&9Vn z56bCujX-t~2e#A3d13mH70C!6+petz8#OGY)(mZu>_#1SiC%gRsEyXF%pN8|T(ixv z4ut3}>#}V}wQjO32VuJ%^uanOxM!)-Q*DMz$pEUbQkh*&0EKR(#k9?KnqeZt(545U zko90ANgw_%5kF+2`6R}1o;#nEQ61V^XX8P^p!%vGV`~Xv!==f}m%1T<7u7fo&w2@% zgFGe(Squ$&hXzQJ+<{^SKf)bdo(b2(C})Jkq|^A=_aF(t2py7a!w3n1WQ!&Mk8`qO zpA-vOv248g32vxP4CjtG-z+}XB3Uu!hGPDJFQ;vwWogrnB`IKFqi8Pou?rgK1&Qrlc=%}?QbS4CPgY&v zrJJ-oElbG; z&1LUCmN}R6bmNa zN1)7OzxW3juxfI1mG&BN6o%_x<2KP1XME<;m(5Fnpa79G7Y&XE6W9%&ABqH2!3@Qp zWML%(@OqQQGnX1ETp>BvDkgqSpxZBNEb#caly3=|3=p<>VuV@Igh!RK4*$aZ<;@*R zvNPb$mDddZE?k*27eIQziv~swVjgFnTgGGO1>p7vIHI${4P8(zSy2#MH;i20?Sw%+ zaNEl+8RPWepqu_&2%AmUcI)67cDdVZZn#R-nAbffE*Nw}5Uf@chFG)2X)wU4M+M;>P3)B5`po98V!Ri;w*dhzm$H z1d1ejg1{7i?-Ip>v;({a_By6B36@M`2DekH>zvAJj9CwrHhiHhaK1j74=LCj=;4>m z`mDL$2kJR!Zj^;M!193C$d@@QshYUo0^&clwH>tCYk$gISpP3B`OKy7$+P-79|-ow zfIP8GVB(=Em)PY1H}nZ$5^Gq=4_PGnSImt;bLE)BVlgdZl4vjGqz>u0&UMT$MReu~ zA=MLl!T~y=$P*bP|4&nQcAL%hSUD;w zKyX6+=K7BOY`zYLu#+u#CU-DoZVa32c+N1ps35Z?K(r@1mfDRC7YY(cFjtsPP+^)P zvVvHJSN}K+g6fWS|KIb5oH>NV^|=Y^RNlLp2(>@N94TDLm+VZ4+jChZ!jSw7_-zdI z9d8K#z5PtcCOmwMH_e0scY>58gXCgAbIlE+Kb|`or>DGIc zqqx@PME^zluOl;as;jbALJ~Mdl{rd+D5)hIonSlo2{prvpU6g@LxttCOl90D70S+T zXLn%?Y-QMS3kM2gsM&+Mk;3l6Zm^aS{YC9wlLt3b}t`8;9=c+M(!5fJ=HIt zq&2fuxdbVxa!K3?M7dPWQqAg@QB$M_N$}N)GudYrd3y;7nSv+on$Ljn@#lcsK(R=5MGB*5V_CzbD|^*9f<;8Z#SE;B4JFa z_CM=4oBmQWP{WRontnhe-f9new+%Q;X?1cXh=TP_eCijtemL#KobwA78hmi=` zh-Ipj{UGZI@n9Wf)6k9FpLGnbf|P{5IAj|ZE5>C81+kD{#k1@H5>o_ufLL-&Ax98Q zq3yDBjI4P=%qcMjrutxWPIxs4?k&&~I94irPs}>6#OL$6LTNQ(dRk zz8ZMkf>8PMezO~>@y-3oB)voTo=2T`0m*ipHJLlq&J^e6v_FF?OD1gkiq0L*0GO7T zRNhml@}6dLk;zL)dP|VpZ6m069+SO-k0pV@o*58@GUY3E)X5K5bs8T_u9kBXvJzOR z*&nRcn`o6ZuLP)HhC{B8dJZ^26)d4BnSOE~9<%+qqA`!tI*h04P>BIRcc$Ki5#J1q;rK~74G{^; zxEjRi{4=7Zy2{sQTsmjcLT1nkQl{NtBF<#SE~acK=B1751F41OVKprGN(SV8>1>0}~w{4h{Djjk3gFgOjf5*MluPPBr|^Gr_8(GeBC@= z#Lvzj?OSG{Yih=&>&;#Dqec?~0y^OY(PdIhy<@Hza$5$er|6c$j@?->i7@z(k13Yn zVq`(iEIR~ZfY^blYDvp810Q{#;aYr=i3oDFPP$gs$70-^mC9Ec#ubIi}o zWX9~NQ>Wap)q#^QJ9L{eH?{x{?qhkwbc(?fN1r&maCFi=x|$@NnG+}YZz+tX+wsZ? zxEzlj+d9K^N)i)U{mEMhzEPc^GAiz!vf>f@{)mQ6*>6cO^Zf?0n=OtuPr zQa4i{$YC)d2F2EZN`h5F<_waTWlk`RZVdts5Hx07 z^?^Cd1I@U-`{EIM>6B=3vSH0}|J%0_h>5sX`+LkOnwfEOjkAb4S?Dh!17-N8cvOK_ z)Nrt9wfb2WyrN1h$Ov88VXdIl<$lq6Sr&x4T*=G8I`jw1AswQIEu(;ND8p1nD*gwl z9g*^AHdZxTOKo75dTiWfSmY-WeqvZlWT3@pLK}{^r~#g%idC3QPcW1rZv9*MhWP7K z=2A;hn%F4Hbyg2asMtw#lv%Qt4CxndZAfuk&{j;UYy>5hkcVLTmL?L2AiJop*#Om` ziTR?_E5S^%h>s?>kNzaw^g;iKtYwhH6e@*LXWSXZ@3=GGH(HpR7(jJTaT6-8)f(-3 zttRY3=$j(e17}2-fC)^aO-q!;-u5~@T5zAo$L>W^9xoS)j{cTm_cAwhXQk*Zqp^;U z{1lL$#>cK9*`nl041zIO)#1SYRfhxTEoE9=U#itL%94S5xL-2h@yJ)q%ZO-zM-NKn z4%65nnIUR{WNY@@U=9n=Le#a}>LxVGegbtaRSYLZ45r~jYADoff^{EmV2SvkjNqZD zElX7P-bV3z0w!B5swjhdZV+M`TBezLnX8p)CRa?UoV5I?3(a8T|48_&^6-->0Io~T z!*13)=HX`tW5^W<=`c+tbt2A{3NH-=x-UNXzyrB9K|a5Q*FTI3AUc>@4KaaCwx=1< z8rTG%DjcTTDk?)}!IS7z%HAUPo@4``B!X^R<%1CB4=}ZwWFT?<{c#1^IEKDi=lUrM zG+`nGIE+k?k)E^9EH^@5A|w%yS`Ha<7Xp}pped0r5IGQPdj3$~q&2nE4`S%EYEo%T zeg$FjXtO~yojO_sLez*v1wse}0dTIOr?+ea8}^`%njPFLRVMJ?%r`+jmOdBR?+?*o zV^kbj;(S6t^g=WRe*`uSf5Zv#M?h)J8lzpguj2h|iyU(ij9S}Yg31bQR^kJ2+uwk5 z9TL50+AGv2?G5gi>WpK?Z#w1^h@7co1feoQGvB7Vbxki{e6SfNAi-};U zp&j1sAm8ht4?+h-BD90Y5JRs+Ihz4-3hiJSW$1P2&pIHYp&j0Eph@>S445l#&<6+{ zgwmrvLpwvB(2?BDBLsW*}Vzk>Ku%D@j8j0U#?9&r`IaZ$ZZR4 zBR}!j-6Jy+kns6ZXsna@=Cs&DIIsJER2AJk3BD32hiT<)QB4cLeS9-Inhmd_sGWB~qtgm=UzO`76I0Q)MsK+y!dW(sW; zDR>@ER~Q>Zz|cYfV1ze>y;JSLrHQlvUeYVTenVkJI5UP*oPg~sa`dHK93G27!ihrV zQ^L#fC@@oU@v@2kf&J+Q0nh$D+DTBO0b3Oj;9~J#F@}T;0S>-6Opbo?%Ex%cF)jC* zlhIdXg6~U}gi^VRg5ZtFrD%cAiO)G41A|f52x*~P6cf|FmkxL|;dU9uvZ#k4dyYTg z=z(21=YVlN#|6Ed^JyaCr^BT{O~1N8?nyp)S3=Fb+h&hF)K9b}clKY4IDt7G`*H>gga_ z$vh{k-DoXnSX#3S=|#Ayv*~p#iHF)lXo3q8m(dWyYey&6r>SGLyADE5PVOT_|21U5$AQ~Q*>N>1sv=Tl6PP<_i+UE^ zEy~&9y#c>ZNe{dNq}J<*Hgt@hmuca`gqreMo)LOrgx;u&ze z3nU)`H~d1z{)EHF%^vW8CA?FE8Yr8Nc}=`~Itnl%bd{|^dxd@~7v6*e0>YW+j%7kI zzrb=BYkfO5M_-j*X-ltnkfZ3~^BRMwWy&+64P_UPv6`gf@i0=yD}6?|g+Q~X+X2@M zJRYo4HqT8#x5OMZI~fHwRuf+`j^D)F0n8>Q`YeGd?yu4iz(*QAR2V4^6~~HoDgj({ z4#iazlsW;wG+2K(&z+!xN+nW=hc4u+L_+D(pjm}(1PQJU37vt0Nr(;7TuM#_$jb&{ zj<)n}!M%9m+rdJ8jS3ApO0AIWtb~O&$LIHO?c~$igz%9^YE|lyGbagc3KZ8lfI!u0 zvuog}c&7>w6hreBp8HNthM;_hZKZPT5ajW36{MH?^)obol7Oc-A?bJr(r4C=5v>ItY%6qrz zPzHljrxJpoyo#++-8vDEA0DINHrO@!i3$VYu{y3qn}zBL4~XiZ62JtHK=coAxe4S) z9*!2x;K($CQ`5{41_;3o1Bt+znUjZ9o(qcen09rNz;r(7+T{F zXr^zd4=Mgbrz?(>atQMr1;RU!!71a2LB@G_kk@8%1lt@R{0%g0@4Crg{*~+Il8lqD zka#F7(s|-k$wl5cIePx7qtmip=#IwV{uZYd;Vmpm zlH2A}0_R$7soieYYTwQGpl>MfLEF3s?@O3-dv`$a*J@Ea`e+chYqfuSi%sOHLK&fe zP_j&g8Nu;*v)R68-HmoPy|Cl@J$942>~LSh2gyu_AIAWN$q;gKB|kNwwsmiEvGIFv zv7uaYAI0N0GzJXL190gzI(1tgPTkh?7r_a#2uTSeu zbm97^u)CiIaD}C38_~PTh(i8%4(*b>khsOnDPn2%1thNuufyv>5NpgA%&X$!nSTX$ z^yEDP9NMQ~sN`mkjG<#PkHf1o5xb|Cj9d_r$mdB^f}QzS+hK!(+~;dC1%z*}-8JZtOyEdCJ^xi6BwHkw8~ygz0=(H@VH#rC!$V{TjUd0)n)MXp&4 zq<-AXDC{2C4b$`%KQUn@x_AQty`owFf(Q^bKE>HUe~u}fx%9HomiUZlbe9#mF8vEp@RSDb&z`XJmKjPVtBfYF^)fTX@}g7D-%P0 z1uqpH#BH{G1>fKbo)^CZDVs7wHu57VdlFPgeu)GW>AO_?Kp>>{9P8hf>VG7)=TrO$ zsz+RGE4AkX1@7LTU^nTD+>~hQ9wAHx!{wD;ZovxjblROw&P?K(j2G6~ zjx!PLARC%JKeuppZlN~&3F%ywAjktfW`to5_dw0}Wa*_Y2|hd~0L7RBom+U%0w}=_ z7zx(_{)!Ov4raU%O#-qAa+R|{)GMMUX5G`i4*N=6iY_1F9ly%u{V%{xd3Ji2iSjO7 zcD+g7m&RpCb-o(b)oi zA%YdcMqq;%%~SuJ_^wGs9$})M?LRTifaydT)@ZYwg#CFuJ~vlE)BKKusWje2@?LbM0god58Bz9)9gB;6!Zcq>u#1bL zN?G;qaH5b$GdEG;q6DJi`4&Kpu}(nEYe>q@If-|b4c|c01FhhTu0*wew7x?Cdwgn# zz#Zgd<%50nw;oh}PU_D2d4Pffl-3PMErezOs38#H3w%`%gud}UO7Sz7rbW9DB?1&m zhW(7h8kDjDa=B~|&_XRZd1Vr0jt4N@Abj~zJZ>`pVLkDE7`<&kS-%E7|4sZ_At+eO zE+R_fK=147IWBTuMogs*FBj;SG*G3JA0(ZT~*`>sU#vXV5911vf96C-?flw;0Ii~HBORhmo7Vu^O6gaR}ZDuM~ z)i{|VzQsmq4bPHs7a0r8$6cl8^{vJMAOJ6-f&ypwW6=rUcc3D>F#uQ*rA0V;w9R2n z!Px*XWscMQ8(;8763B~8v|X=vWAvF878rg8WKe2hh3MdySLO_CAk9^a5ZkoSOlirqQ-KH3XyUO?>sj7rA0S z)i`q#A^vAw{IfRAN?0ZCKs79fKfRLKWvG=BLgGlk-PA_cjQoIbYypBXUOMH z%%G=k`B~&d4maB?D^#$*$O;}(*!Ga7Z=4XAsjw^@-frP2z_=J_}>wDf|_CL?$5|d>ngwu8bU3kDreTV(j o04BDaxeTKOzj${6zv&wchn)|WE|z!!W287_o*O z^X31UNrp-9qwIRSeDB~D3ExEl;6GU?J_0O&6R;H^R01jmn}ADUo3ii0Pu}N7!wI=y z&N5oq0@+Kc0dv9$D^q7H~f;NJT^{C zRo3-cZdRL#HKZrMv(?+kPX7h%$;-Cfoyvpu64BI#5U1^#hWy9eH7Z!Wh%= (3, 0) and not isinstance(aBuf, bytes))): + raise ValueError('Expected a bytes object, not a unicode object') + + from . import universaldetector + u = universaldetector.UniversalDetector() + u.reset() + u.feed(aBuf) + u.close() + return u.result diff --git a/requests/packages/charade/__init__.pyc b/requests/packages/charade/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c62514eb50b073b74338aed394064bf64b2edd5 GIT binary patch literal 835 zcmb_ay>1gh5T3n@e{dW~C}=`qiRKFI1EolV5W)nyNQ3}Vn$zZXP1Zi&ncY2vC8vq0 z=y@yNfXB!Kgm2b%B2lx_e7E!e&D_SaxB?ps^HmC8$IRs0}I_G;PwQAh8fMZqbtHGNMI9 z<2K&~-|le>4>ve@epx8(kyF`(mwVUXUzHbj0wLewIA==dWtnT=g1YYHdDDSO2>K+8 zS|3?kS?m$nVe#DiUD_dg#DZ z**tV!?dK7yx`*6F?2E_ZL9{Enq9b-7#|d-x+khMBAwU SVp^%X&@Y*#V@gf28~+8!*R*>8 literal 0 HcmV?d00001 diff --git a/requests/packages/charade/big5freq.py b/requests/packages/charade/big5freq.py new file mode 100644 index 0000000..65bffc0 --- /dev/null +++ b/requests/packages/charade/big5freq.py @@ -0,0 +1,925 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +Big5CharToFreqOrder = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 #last 512 +#Everything below is of no interest for detection purpose +2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392 +2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408 +5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424 +5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440 +5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456 +5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472 +5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488 +5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504 +5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520 +5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536 +5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552 +5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568 +5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584 +5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600 +6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616 +6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632 +6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648 +6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664 +6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680 +6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696 +6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712 +6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728 +6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744 +6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760 +6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776 +6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792 +6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808 +6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824 +6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840 +6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856 +6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872 +6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888 +6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904 +6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920 +6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936 +6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952 +6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968 +6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984 +6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000 +6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016 +6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032 +6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048 +6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064 +6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080 +6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096 +6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112 +6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128 +6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144 +6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160 +6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176 +6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192 +6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208 +6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224 +6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240 +6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256 +3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272 +6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288 +6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304 +3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320 +6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336 +6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352 +6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368 +6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384 +6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400 +6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416 +6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432 +4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448 +6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464 +6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480 +3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496 +6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512 +6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528 +6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544 +6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560 +6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576 +6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592 +6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608 +6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624 +6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640 +6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656 +6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672 +7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688 +7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704 +7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720 +7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736 +7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752 +7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768 +7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784 +7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800 +7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816 +7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832 +7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848 +7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864 +7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880 +7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896 +7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912 +7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928 +7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944 +7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960 +7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976 +7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992 +7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008 +7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024 +7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040 +7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056 +7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072 +7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088 +7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104 +7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120 +7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136 +7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152 +7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168 +7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184 +7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200 +7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216 +7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232 +7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248 +7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264 +7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280 +7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296 +7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312 +7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328 +7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344 +7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360 +7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376 +7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392 +7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408 +7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424 +7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440 +3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456 +7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472 +7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488 +7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504 +7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520 +4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536 +7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552 +7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568 +7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584 +7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600 +7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616 +7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632 +7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648 +7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664 +7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680 +7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696 +7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712 +8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728 +8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744 +8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760 +8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776 +8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792 +8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808 +8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824 +8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840 +8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856 +8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872 +8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888 +8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904 +8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920 +8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936 +8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952 +8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968 +8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984 +8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000 +8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016 +8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032 +8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048 +8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064 +8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080 +8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096 +8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112 +8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128 +8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144 +8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160 +8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176 +8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192 +8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208 +8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224 +8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240 +8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256 +8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272 +8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288 +8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304 +8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320 +8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336 +8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352 +8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368 +8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384 +8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400 +8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416 +8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432 +8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448 +8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464 +8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480 +8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496 +8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512 +8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528 +8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544 +8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560 +8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576 +8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592 +8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608 +8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624 +8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640 +8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656 +8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672 +8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688 +4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704 +8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720 +8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736 +8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752 +8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768 +9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784 +9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800 +9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816 +9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832 +9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848 +9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864 +9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880 +9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896 +9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912 +9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928 +9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944 +9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960 +9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976 +9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992 +9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008 +9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024 +9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040 +9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056 +9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072 +9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088 +9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104 +9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120 +9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136 +9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152 +9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168 +9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184 +9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200 +9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216 +9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232 +9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248 +9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264 +9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280 +9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296 +9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312 +9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328 +9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344 +9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360 +9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376 +3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392 +9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408 +9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424 +9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440 +4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456 +9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472 +9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488 +9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504 +9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520 +9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536 +9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552 +9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568 +9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584 +9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600 +9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616 +9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632 +9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648 +9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664 +9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680 +9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696 +9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712 +9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728 +9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744 +9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760 +9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776 +9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792 +9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808 +9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824 +10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840 +10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856 +10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872 +10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888 +10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904 +10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920 +10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936 +10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952 +10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968 +4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984 +10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000 +10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016 +10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032 +10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048 +10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064 +10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080 +10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096 +10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112 +4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128 +10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144 +10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160 +10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176 +10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192 +10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208 +10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224 +10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240 +10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256 +10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272 +10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288 +10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304 +10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320 +10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336 +10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352 +10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368 +10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384 +10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400 +4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416 +10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432 +10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448 +10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464 +10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480 +10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496 +10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512 +10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528 +10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544 +10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560 +10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576 +10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592 +10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608 +10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624 +10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640 +10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656 +10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672 +10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688 +10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704 +10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720 +10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736 +10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752 +10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768 +10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784 +10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800 +10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816 +10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832 +10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848 +10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864 +10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880 +10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896 +11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912 +11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928 +11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944 +4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960 +11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976 +11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992 +11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008 +11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024 +11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040 +11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056 +11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072 +11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088 +11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104 +11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120 +11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136 +11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152 +11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168 +11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184 +11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200 +11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216 +11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232 +11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248 +11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264 +11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280 +11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296 +11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312 +11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328 +11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344 +11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360 +11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376 +11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392 +11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408 +11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424 +11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440 +11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456 +11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472 +4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488 +11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504 +11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520 +11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536 +11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552 +11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568 +11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584 +11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600 +11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616 +11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632 +11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648 +11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664 +11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680 +11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696 +11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712 +11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728 +11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744 +11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760 +11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776 +11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792 +11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808 +11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824 +11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840 +11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856 +11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872 +11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888 +11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904 +11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920 +11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936 +12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952 +12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968 +12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984 +12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000 +12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016 +12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032 +12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048 +12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064 +12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080 +12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096 +12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112 +12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128 +12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144 +12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160 +12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176 +4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192 +4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208 +4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224 +12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240 +12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256 +12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272 +12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288 +12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304 +12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320 +12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336 +12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352 +12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368 +12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384 +12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400 +12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416 +12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432 +12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448 +12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464 +12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480 +12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496 +12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512 +12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528 +12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544 +12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560 +12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576 +12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592 +12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608 +12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624 +12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640 +12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656 +12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672 +12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688 +12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704 +12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720 +12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736 +12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752 +12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768 +12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784 +12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800 +12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816 +12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832 +12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848 +12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864 +12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880 +12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896 +12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912 +12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928 +12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944 +12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960 +12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976 +4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992 +13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008 +13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024 +13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040 +13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056 +13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072 +13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088 +13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104 +4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120 +13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136 +13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152 +13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168 +13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184 +13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200 +13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216 +13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232 +13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248 +13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264 +13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280 +13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296 +13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312 +13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328 +13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344 +13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360 +5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376 +13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392 +13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408 +13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424 +13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440 +13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456 +13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472 +13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488 +13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504 +13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520 +13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536 +13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552 +13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568 +13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584 +13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600 +13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616 +13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632 +13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648 +13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664 +13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680 +13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696 +13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712 +13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728 +13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744 +13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760 +13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776 +13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792 +13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808 +13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824 +13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840 +13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856 +13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872 +13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888 +13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904 +13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920 +13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936 +13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952 +13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968 +13968,13969,13970,13971,13972) #13973 + +# flake8: noqa diff --git a/requests/packages/charade/big5freq.pyc b/requests/packages/charade/big5freq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b72e9b445c2d0ac8167d6c924ef396b509cbe96 GIT binary patch literal 113804 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 0: + self._mTotalChars += 1 + # order is valid + if order < self._mTableSize: + if 512 > self._mCharToFreqOrder[order]: + self._mFreqChars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._mTotalChars <= 0 or self._mFreqChars <= MINIMUM_DATA_THRESHOLD: + return SURE_NO + + if self._mTotalChars != self._mFreqChars: + r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars) + * self._mTypicalDistributionRatio)) + if r < SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._mTotalChars > ENOUGH_DATA_THRESHOLD + + def get_order(self, aBuf): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = EUCTWCharToFreqOrder + self._mTableSize = EUCTW_TABLE_SIZE + self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = wrap_ord(aBuf[0]) + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = EUCKRCharToFreqOrder + self._mTableSize = EUCKR_TABLE_SIZE + self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = wrap_ord(aBuf[0]) + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = GB2312CharToFreqOrder + self._mTableSize = GB2312_TABLE_SIZE + self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = Big5CharToFreqOrder + self._mTableSize = BIG5_TABLE_SIZE + self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = JISCharToFreqOrder + self._mTableSize = JIS_TABLE_SIZE + self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = JISCharToFreqOrder + self._mTableSize = JIS_TABLE_SIZE + self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = wrap_ord(aBuf[0]) + if char >= 0xA0: + return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1 + else: + return -1 diff --git a/requests/packages/charade/chardistribution.pyc b/requests/packages/charade/chardistribution.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1bc134418254ae7fbd6982bafc9260a87a6e19b GIT binary patch literal 8149 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 literal 0 HcmV?d00001 diff --git a/requests/packages/charade/charsetgroupprober.py b/requests/packages/charade/charsetgroupprober.py new file mode 100644 index 0000000..2959654 --- /dev/null +++ b/requests/packages/charade/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +import sys +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mActiveNum = 0 + self._mProbers = [] + self._mBestGuessProber = None + + def reset(self): + CharSetProber.reset(self) + self._mActiveNum = 0 + for prober in self._mProbers: + if prober: + prober.reset() + prober.active = True + self._mActiveNum += 1 + self._mBestGuessProber = None + + def get_charset_name(self): + if not self._mBestGuessProber: + self.get_confidence() + if not self._mBestGuessProber: + return None +# self._mBestGuessProber = self._mProbers[0] + return self._mBestGuessProber.get_charset_name() + + def feed(self, aBuf): + for prober in self._mProbers: + if not prober: + continue + if not prober.active: + continue + st = prober.feed(aBuf) + if not st: + continue + if st == constants.eFoundIt: + self._mBestGuessProber = prober + return self.get_state() + elif st == constants.eNotMe: + prober.active = False + self._mActiveNum -= 1 + if self._mActiveNum <= 0: + self._mState = constants.eNotMe + return self.get_state() + return self.get_state() + + def get_confidence(self): + st = self.get_state() + if st == constants.eFoundIt: + return 0.99 + elif st == constants.eNotMe: + return 0.01 + bestConf = 0.0 + self._mBestGuessProber = None + for prober in self._mProbers: + if not prober: + continue + if not prober.active: + if constants._debug: + sys.stderr.write(prober.get_charset_name() + + ' not active\n') + continue + cf = prober.get_confidence() + if constants._debug: + sys.stderr.write('%s confidence = %s\n' % + (prober.get_charset_name(), cf)) + if bestConf < cf: + bestConf = cf + self._mBestGuessProber = prober + if not self._mBestGuessProber: + return 0.0 + return bestConf +# else: +# self._mBestGuessProber = self._mProbers[0] +# return self._mBestGuessProber.get_confidence() diff --git a/requests/packages/charade/charsetgroupprober.pyc b/requests/packages/charade/charsetgroupprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1922f31d6019d9bad7e9a6853103efcf4f9ed94 GIT binary patch literal 2708 zcmcgu%Wh*u5Uu;L6FUjX3{i%~NSMb+mSDz1Bs2&O3?xw^6k)+NVnn3q%JJ zOD3NPzaOC4ZHNrtKzbtmK=uL&vQV-}dZFw=!CWl8Ncyqt#h5FIiRCbmtSC=Ko``(0 zSK#tSbq=OF0YsI;l^|NffpyJ+vz>qOsr!i~Ol%%C^M-MsJ3}z71i7KEf@WPX7W`B7xH!iRlX!I2Ef>l%!EDU}uYV*g~{TH2Wrm6X^zWj;rwI zs->Z{g+nRKdIi=5SLDum2STbvh(s?s4=qhQgN{p6x4=&S!W38X}@NkVay~8SgMTPwwT5W9eT5s5D_G-P(L2Y#Aj)sHvdk<<^ z$GW?tX6v}wHnx_V6Bu;1b~(}l)XmJ)_-l=86X22Jes6S^kO;4$S>8f|rJ#gAMT&Q& zFN)Lwl>bNS^dXVzMzXd4mRtb8K=KMDP<;Z6xHCFwfve&!0v5`H5D1@C_}MJ(1{?2blrP4g62&Q^KyI`B^?Tj%)Ap|H8iMg;fWf*UvNc;lj^ydi}Tl+uC zMJVT?*xPba7D5n`RrZbNx>x|X0=bCfJYqVVtc=7((v9Ufl>CSr$ucEjx2OnWHCN2( zin6$QE=u+N$K4Y1$~$3NQeV&uWR!S`)t9qprlQx zDRU2v$r5yUG}7Aka6HI9a*0Nh3}V!fJe{YvsSn-9#*z2i&7L*-3>+7y{RUTgF3^-( zZ*GhalSTH3vUS%J>1CYtF3)=%LISeBh*%ecW!087_LR%`TMTaa*T74$DF^<6;;9dw z`+VY%Ob`G>@@2-QfrxV`(xG(*r-7souHdEkFrWS~iO$yk_fu-@%gL^iNTY7QRU7k? z@3K^N%hFvSgSv}k2TI2+)&uOAZCc{YMLga2>uev2;^o$JRL4-(xZ5)p1INf+y8?xL z22quY-nNpaAog#qp`c(xD@(ooZ0C=!SD*d)sQt|<)u)fz07gHSVXX{?uHtiE*}jN@ zJGL@=`<3@9cWk-JhnKL_D9;k+f`qkpmL;F#Br|84nS*f~?*bt_vzj=q%S@gt@xIDC z&LnD-HC&6TrjcX~U8V5>YR@K8(2RPmYbs>)s7}9`X$0h24q|O2;FO4^;AXG@DlTGd zF}Q_R#9Rq0^}iRrLaI3urJUI+P5Z-a+%sval``SO^azmZiNXNI*J*uYS6Nv2lwU#9 zM2dSAOXbphX;m46>I{ceyaeg!+N9+B+NX6ip@~^8xN46T(1#wv_iy89OO~ww_m${B DvBN8i literal 0 HcmV?d00001 diff --git a/requests/packages/charade/charsetprober.py b/requests/packages/charade/charsetprober.py new file mode 100644 index 0000000..9758171 --- /dev/null +++ b/requests/packages/charade/charsetprober.py @@ -0,0 +1,62 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +import re + + +class CharSetProber: + def __init__(self): + pass + + def reset(self): + self._mState = constants.eDetecting + + def get_charset_name(self): + return None + + def feed(self, aBuf): + pass + + def get_state(self): + return self._mState + + def get_confidence(self): + return 0.0 + + def filter_high_bit_only(self, aBuf): + aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf) + return aBuf + + def filter_without_english_letters(self, aBuf): + aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf) + return aBuf + + def filter_with_english_letters(self, aBuf): + # TODO + return aBuf diff --git a/requests/packages/charade/charsetprober.pyc b/requests/packages/charade/charsetprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2b8119c8eb5c8d269c4c415f2c49831658d57d4 GIT binary patch literal 2391 zcmcgt+iuf95FN+qC8dRe-~k~JAR!r5sl`QthYCTBF5Zn$Q4tU2 z7x*l`fY0Cq;G9jIK%p;4iIW}A&hC27nVs2ne{8IM`~G!5mdWGd{Sr+-fk^OoBoi4r z(s9H|YLd8;)uaQZF3GYaOY%kJOyr>Ba;)vGU|s4!coe1q5f`~OQEqhl6Hm)*z_vGt z%C<6Z%A%{vsdp~fMbifmO6U|A;DHVutH4doD)8@GWrckX*Y~|tH>7#mSOEH6HYcJ%%h=Vgeu&O7~4g-F(e)**w|VI(e7yedBafkluEYn zuCP`)GsVjNN46ZzQiVeSH)w(Rz|v!gaUdAAjn0L5NeVUJwgGMR(X-DuV=eTBB=BW; zwK-Aby);pItRBHqp{_E5U~MMfgfgy7V8=;y>d2WZpHQfz!s2XcmbrH*&ChQiZW%JU zYdIQztW<`R^r$;aq<}%2d!=57lU|w`RfdDKKM1=xg^D~oc}h6sC(aEg{x8Cpu-H3% z)$BygkKi2e0vOX{bb~9?F2BAQws+uZ!uCUogL`B`mG`q$55i0t1VKN?jK6tL%ZU-O zdrHgXwy^LQ$KlqW9L^KiApxS1n#UcOTrWJ-!qDChVK^+3QHE~7qzjfQn4JOdj)04T zbqXGg!BvWD5VKUY+I%jW%ss1a|@D24Gg$bmGE=K(qnf8He!2 NZFsfmvgxe5zW_|@8i)V@ literal 0 HcmV?d00001 diff --git a/requests/packages/charade/codingstatemachine.py b/requests/packages/charade/codingstatemachine.py new file mode 100644 index 0000000..1bda9ff --- /dev/null +++ b/requests/packages/charade/codingstatemachine.py @@ -0,0 +1,61 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .constants import eStart +from .compat import wrap_ord + + +class CodingStateMachine: + def __init__(self, sm): + self._mModel = sm + self._mCurrentBytePos = 0 + self._mCurrentCharLen = 0 + self.reset() + + def reset(self): + self._mCurrentState = eStart + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + # PY3K: aBuf is a byte stream, so c is an int, not a byte + byteCls = self._mModel['classTable'][wrap_ord(c)] + if self._mCurrentState == eStart: + self._mCurrentBytePos = 0 + self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] + # from byte's class and stateTable, we get its next state + curr_state = (self._mCurrentState * self._mModel['classFactor'] + + byteCls) + self._mCurrentState = self._mModel['stateTable'][curr_state] + self._mCurrentBytePos += 1 + return self._mCurrentState + + def get_current_charlen(self): + return self._mCurrentCharLen + + def get_coding_state_machine(self): + return self._mModel['name'] diff --git a/requests/packages/charade/codingstatemachine.pyc b/requests/packages/charade/codingstatemachine.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19218a1639cf83b78a37b698b82f4ecc15b9da35 GIT binary patch literal 1953 zcmcgs&2G~`5T3P@l$4(qC@PUSz=?oFEg_)_sY0lcdZH0H2#H))uD!Hw{S&+!L8bOo z4!i)5#S`!tya3o`0Tlt2Ax%T9L&|!Tb?6(>7176Ohq5kBhHJQ+E2tqW*Ml+>mo(0=uVMYANoKlk zGIs}yQJv-0F-|yhn4~9pWtMo@!9K*kfHK4|fCBGL1IES%Km=mo^-zp%i)q@Ucrxtb zW*R^(WW@fSKwT)hAkq>g8}RLS0^UCjIVcW#GUTh{9Eye=D8~`%^03ZK;Wot{&6~zl zZvWhwx3&Fub99n4Z}5?kG{zby{v3O8Lqb#@X*(^!Vl4E0|#(bU|>uj{#N%2~enJAU4TFz?ev$_K(oP4eGDtB5xf^B(& zR9}8mPB#l9k~H0f;gBhx9Zm&*9!mf*EONJ?blHY49LkZHQ?!zhVy>^p5X-1Z3D=z4 z5F$Z*hrxsj(E|sL6wuINiM8*OqrymKxf{IaOGS3w^~IrsBz1Ko zmxND$iJ2I3@G(ak^D<_?!b{8VD3*-cEShmS!sXvd1ofhsAD?;GZF#U14C<4uW0Muz7_w?ktO-`ap=u(uP0 z0c$N>YF*aZyudQ<KMuH54xfOb<-|L6{jea=x5V%qt qqfF}xC0{w~rx>?UT9>oL`95MVs{<`L-Sb&|^#D&>?%qwc8U6utNwfU` literal 0 HcmV?d00001 diff --git a/requests/packages/charade/compat.py b/requests/packages/charade/compat.py new file mode 100644 index 0000000..d9e30ad --- /dev/null +++ b/requests/packages/charade/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Ian Cordasco - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + base_str = (str, unicode) +else: + base_str = (bytes, str) + + +def wrap_ord(a): + if sys.version_info < (3, 0) and isinstance(a, base_str): + return ord(a) + else: + return a diff --git a/requests/packages/charade/compat.pyc b/requests/packages/charade/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce213b718ef4f2cb9841803dfe2c556c12ead91c GIT binary patch literal 607 zcmcIgy-ve05Wf7hpem>nYv%}w8nLh-gv7>xM7ni}T-&9lX&ihGs1jRw1s;nh;4ydr zxJwa5>{z+azH{#TzH{<%FnD`^y;bnN651~*@QOgw7eNIu1uy{j5$GN)0sIk|7)%25 z7^W%I8JHedwy93xg!! ft%JdWxpvn7&Hwqz>9#T#ha`tQP?ij%VVosjM%RC( literal 0 HcmV?d00001 diff --git a/requests/packages/charade/constants.py b/requests/packages/charade/constants.py new file mode 100644 index 0000000..a3d27de --- /dev/null +++ b/requests/packages/charade/constants.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +_debug = 0 + +eDetecting = 0 +eFoundIt = 1 +eNotMe = 2 + +eStart = 0 +eError = 1 +eItsMe = 2 + +SHORTCUT_THRESHOLD = 0.95 diff --git a/requests/packages/charade/constants.pyc b/requests/packages/charade/constants.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8724d46ac57b1b2a37ce08de1398e2286239873c GIT binary patch literal 356 zcmYL@y-ve05P&a98&D+}*x9pCO9+Vt0TL~0rM8GBELkeoK2nPi7yB~sAUqaNz&o(; z0$hFsw(j%Y=R3>M&(Y}f>*G;DzXCpQIs64f1LPe8&;jHj=n(R#^@G+7TN8thAU^;- zfHWEMpy2@1yk$a0@!YQOn^khiCB=-5#%*2Dh*O*(p(0Zi)Li4ett&mJwhdR7me{2! zN!Qz{bJlfsPM#Z1crcwkth2kPY?IB_Q!W;hgf0BTFS!)8ccQdPmZCIUv45wXtk_X|IrqnmIE(|{J%0g* Cdr*u3 literal 0 HcmV?d00001 diff --git a/requests/packages/charade/cp949prober.py b/requests/packages/charade/cp949prober.py new file mode 100644 index 0000000..543501f --- /dev/null +++ b/requests/packages/charade/cp949prober.py @@ -0,0 +1,44 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import CP949SMModel + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(CP949SMModel) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self._mDistributionAnalyzer = EUCKRDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "CP949" diff --git a/requests/packages/charade/cp949prober.pyc b/requests/packages/charade/cp949prober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9bba624ff58af8aeee7b0e279efb38f869ff6a45 GIT binary patch literal 1196 zcmcgr&2H2%5FT&#uccKh4oDzQaEXLyB!obf5P~k8&@Lqr2Xe8piM#98PC`66EaC>Q zz+>?QJO(eojJ;hBoXcis;_*11`M#Nnejo1t{Pp8Q3EN*p?^h%)Csom3fB~=qash(v z0hj^U2=XY{5tt#^5#*y_55bJVP9UFEI`-c-uqt?P{tWCx#EEanDF0z@>n%gq8@y0bs-{vgHtP#2oN?%=&V|CbOFPG#8$glr8~eex%g3Mk!Mc zl199}&)as(#60E5o;zv(0slpH6c30OtYrYuZi^fGBT zxNhnvC(o0L2z}fZP1LV$gj&w#0f{GXEcT|0m^s2DQg*q;5GoP+hzFCa42%fLEoj^rNX1gqr#`ir=mqsi;6ZyZEN9C-l3vPQP=i;%6nAw zDeBvPi}DpJRw-KLew$R6CJtpC`jO}*(bH&+vMz;#9v@)luoyrXbknNTCMk^`_{*Wk zQ8*e^naa&35ABCvZ{OSA-W^{t_~nx;2EPiLLA%Ksud#cS)S)s@>gt)Q?eG?ct87+I zLz5UaO46fQsq9>r=f1C#d0f?*oZ+EPFD>x~TDY;pO@GKj5fEiS+3Uy!%uqbw3&p3* z6QxC&FG`z&aM0o}Q>=rA&Mr6on1vxac8E!P$vhdCj0X*hzf@XFr4423!#eIj9(RE} z=nciGv49_70|Wo!cvj9#90zUg1lT)pAv_45h3T`1iw2{S!I!nt%29lCWPqQdZ7%^Oj0xZPVpW@xhfkR zKbOI9B&Or4ROT(7kBdEJRBBX)_yV{>0^AjrQX8S8YegAu47q8f8>8%OI&FS>&bqVZ z2-3^&6r?+B1eh)mk?27}NoWK({dFE#QgW(HjF@4};xZ}J$GoWqcyz^)Z}PA`a?O>< zp^#HD6iPwTc>3y#KYzIK>hDjd_#Qv&$p7flI&Ug2Rpn%ssWMd$ctj(dh?(%+6uuz` z(S(P;SULM0A-s3^n$BH1`?Ya$@9-Bo=MeWUBA#^)bbY@`0Cc6GypUk$ct7W4@Da$z zEjn?j{+T$I*({b+@Q*vd?Y`R-7w)-q;!ypYeA1OH>B;teq*KW0)GW6m%iR*Y)ukP8 zzXm%b*ZSqp4o*9C0J7{t17S!mjTt*kgAEpvbOA7v>?+lniTM^WDnM`s+;DoX$Peqf zs-<*2N^-3NM7W(9S7xLP%;Q3C0J)7ofh=T=_KjwvE>?O}Ey`@)n0L5iiNf7sjpM@J z9)Sc52$CF-R8Mvm6N3avgSS~4BwLf!IPkUR398aWsceVe`aKpXq08iMJ2#yT4y_G- zRypY*H@LJ8fJt*jAhF`uR#~SWI0beA#xbkAde*{hGuvd+}6+xb5Mj~LzDdI??A+3seVr+!rAlL4$ Wknq65{>i(%qqx24+-45>@%{zNj1pb| literal 0 HcmV?d00001 diff --git a/requests/packages/charade/escsm.py b/requests/packages/charade/escsm.py new file mode 100644 index 0000000..1cf3aa6 --- /dev/null +++ b/requests/packages/charade/escsm.py @@ -0,0 +1,242 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .constants import eStart, eError, eItsMe + +HZ_cls = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_st = ( +eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f +eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 + 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f + 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 + 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f +) + +HZCharLenTable = (0, 0, 0, 0, 0, 0) + +HZSMModel = {'classTable': HZ_cls, + 'classFactor': 6, + 'stateTable': HZ_st, + 'charLenTable': HZCharLenTable, + 'name': "HZ-GB-2312"} + +ISO2022CN_cls = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_st = ( +eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 +eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f +eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 +eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 + 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 +eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f +) + +ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CNSMModel = {'classTable': ISO2022CN_cls, + 'classFactor': 9, + 'stateTable': ISO2022CN_st, + 'charLenTable': ISO2022CNCharLenTable, + 'name': "ISO-2022-CN"} + +ISO2022JP_cls = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_st = ( +eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 +eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 +eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f +eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 +eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f +eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f +eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 +) + +ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JPSMModel = {'classTable': ISO2022JP_cls, + 'classFactor': 10, + 'stateTable': ISO2022JP_st, + 'charLenTable': ISO2022JPCharLenTable, + 'name': "ISO-2022-JP"} + +ISO2022KR_cls = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_st = ( +eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f +eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 +eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f +eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 +) + +ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) + +ISO2022KRSMModel = {'classTable': ISO2022KR_cls, + 'classFactor': 6, + 'stateTable': ISO2022KR_st, + 'charLenTable': ISO2022KRCharLenTable, + 'name': "ISO-2022-KR"} + +# flake8: noqa diff --git a/requests/packages/charade/escsm.pyc b/requests/packages/charade/escsm.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e90400e2de85b0acdfbebbe8f93637f4f8dad739 GIT binary patch literal 7328 zcmeHM-BJ@V6h7NRX$wU}P*mi4Z^~kw!5hb6WYp3M*4C@sILmG-J8oNS!i5jwTlgwI zfsf$}cuvyo{?Ib~6n31J?WE`ABwx;VlALBk_HU{9`_Io$4g`M&z#hutR~EpR=CqBA?YVV>65fBQ?g@KIfpk7cQ2i`nz#L2@h;<^RcGb0rX3GMqBspz;;MKLYm!2|{b;KJ?LA-xa32FJD(ZPneOXgS3sEm> z>i0DDMR1=0Te^@s1|#4xT8J_}F9&_~1Z#w3JoLnCmgBf;c8@H$ zwh8P$xX*yCDwkJc3m7frG7=z{*R;#%`8u@BE!?#p?p`o)=Yq^(!CTVqOD(?b_j`RU z9!PP>J+y;2N5wo987io!M?GZ`3&*#G_-r5hTrLLcJKK?nLuMgu$+dZj%qMpL1MjK| zLG~&uzkgG%ym(%bG)&j-aIZl92<)Ksv0T}yRLc8D-U8}go(csUGuImN=Jn>03CL10 z)f})Rq$W|oQyV;0=F>5_+8~N*xJ#6(CVo~7HsUN0cN_?lvh>A?N9ReE*VEstlgX3n z_bF8}VLnLJjsItGwf<(s;D9v?#2p91EZ|nTI8P?5lT4f8bYFABUMX#=b97>$v@&M+ z^Au)Gb;M8jr&KjZ>U=fII+bFdT0T@zrI7_Ybzr+e$p(idi~G?&0-Ud`7q7f3qxIK3|3qjsfeQg&!k&T5kL>ZZ2J zzBs;+lmJi^QZ6fLKXTKmK&q^Dc-V8fFH6_}uU6@1b^l0prmNYo1~Jy76)~ulsAU9V zt&v2;nmA&uF%GfT7=c)CCK0hFj#zJwL##Ikh$i|CVIdAswa!G}@_UZ$TfTQ}o&Jy~ zy>4aurR91;mQQWxoBfpwtIxlmaUq2@tZ^{7w#zLp9MRdvespSm)# k+Qk2W-Q>y5Z5Y9`mCa>}#)5i^6T~I_+r+*t^r+AO01oEno&W#< literal 0 HcmV?d00001 diff --git a/requests/packages/charade/eucjpprober.py b/requests/packages/charade/eucjpprober.py new file mode 100644 index 0000000..d70cfbb --- /dev/null +++ b/requests/packages/charade/eucjpprober.py @@ -0,0 +1,90 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from . import constants +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJPSMModel + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCJPSMModel) + self._mDistributionAnalyzer = EUCJPDistributionAnalysis() + self._mContextAnalyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + MultiByteCharSetProber.reset(self) + self._mContextAnalyzer.reset() + + def get_charset_name(self): + return "EUC-JP" + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == constants.eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + + ' prober hit error at byte ' + str(i) + + '\n') + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mContextAnalyzer.feed(self._mLastChar, charLen) + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen) + self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], + charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if (self._mContextAnalyzer.got_enough_data() and + (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + contxtCf = self._mContextAnalyzer.get_confidence() + distribCf = self._mDistributionAnalyzer.get_confidence() + return max(contxtCf, distribCf) diff --git a/requests/packages/charade/eucjpprober.pyc b/requests/packages/charade/eucjpprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..384e863bcffff181e7e2bf0fb711fb25e0152028 GIT binary patch literal 2946 zcmcgu+io015UrV=UGHw}T%6dBlL(n0&`Ky-fw;UxT(S;IqS!IxL=lV7Xgt%lXEPUj zx>wj>KLzo^Ge5ykvbfhx=;(IDC+0%A_0Nw7(@B;4#Zu`{6@HXm((rYY2jj6694ex7*77t?VIF*8%TP0pypp_dBKrp)zT7kx<5w9!RTR%RxOLLL_Kc*6xzF@bX}Y>-C> zM8zote^PZAaQ@O{&k1~(f?6WA(#kkbaHUrHb`M{%oqi0eKh||WuaY?L=h;?&@6ha4 z<;S-_@27Cst-UyT9`7jKuhsroX`}nEI0*tFPE}uxlhNLu4Tsx%hv5ulet@QFh~*3K z*L4d$!t>U{4W}B{y#-CpMVzyvOhmW9=TR9K>Lc(p)epWWf0ZAyzpi9hcCV3h7Dpk1q3DD^OX-?Reu z;P;G}*>rw&s*dN>S)|@XV96@|a(d`h@@qF-p02qj&jT{KehSI{OJYbHtSFbd)-(84 z^fh!V?n18YW@bgzbycs#W@QWMdqp!KyDs5h2Z>B3lB?3Ci@4lTVVi7Tvl7`jLM1RN z#7GQdN8O`1OGc^M8t+&E`cPYzHYtv?vVN>H?3?309)axd_ODlFO(9U2(rmqO><31J z&7;*f)woO_7{|ww+L+7W+vpzGHFUL6PNiM8d=zWLx@2<$U=rC@Dh*l6Y(3*nYldB~ zR+UkSLAf#)D7G?@Dy#9%Zj{Eb_5Adxs@%>}RVK=?z-``t96lL5eG)ynAKt^@(Q1!y z*sE=ijPH)O9q|Z?5#`L*s^p|HTB~_MvEqyq7qjapX!Z^4`Q6WT!6u?^7lhv*n{_}MIdjQ9pUP1;BzaJ371T(N1% zqd%-?!keV5S17WG4|@DM2Y&)! z057&CHNoWs_xfN+yU4T`qi}CF`wp?Cgj*&auunGk5aH3Iy#!uz4-bwZUhBd>UP6xF Y0tD7Icbqf6xPdb@ZJ+fnp8Pld1BIk_hX4Qo literal 0 HcmV?d00001 diff --git a/requests/packages/charade/euckrfreq.py b/requests/packages/charade/euckrfreq.py new file mode 100644 index 0000000..a179e4c --- /dev/null +++ b/requests/packages/charade/euckrfreq.py @@ -0,0 +1,596 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKRCharToFreqOrder = ( \ + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +#Everything below is of no interest for detection purpose +2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, +2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, +2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, +2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, +2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, +2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, +2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, +2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, +2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, +2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, +2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, +2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, +2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, +2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, +1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, +2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, +2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, +2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, +2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, +2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, +2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, +2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, +2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, +2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, +3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, +3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, +3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, +3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, +3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, +3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, +3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, +3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, +3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, +3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, +3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, +3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, +3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, +3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, +3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, +3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, +3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, +3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, +3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, +3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, +3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, +3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, +3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, +3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, +3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, +3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, +3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, +3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, +3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, +3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, +3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, +3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, +1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, +1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, +3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, +3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, +3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, +3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, +3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, +3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, +3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, +3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, +3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, +3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, +3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, +3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, +3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, +1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, +3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, +3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, +3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, +3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, +3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, +3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, +3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, +1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, +3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, +3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, +3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, +3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, +1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, +3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, +3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, +3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, +3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, +3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, +3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, +3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, +4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, +4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, +1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, +4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, +4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, +4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, +4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, +4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, +4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, +4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, +4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, +4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, +4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, +4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, +4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, +4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, +4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, +4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, +4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, +4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, +4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, +4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, +4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, +4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, +4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, +4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, +4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, +4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, +4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, +4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, +4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, +4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, +4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, +4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, +4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, +4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, +4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, +4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, +4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, +4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, +4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, +4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, +4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, +4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, +4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, +1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, +4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, +4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, +4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, +4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, +4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, +4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, +4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, +4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, +4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, +4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, +4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, +4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, +4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, +4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, +4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, +4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, +4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, +4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, +4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, +4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, +5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, +5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, +1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, +5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, +5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, +5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, +5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, +5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, +1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, +5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, +5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, +5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, +5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, +5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, +1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, +5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, +5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, +5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, +5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, +5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, +5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, +5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, +5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, +5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, +5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, +5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, +5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, +5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, +5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, +5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, +5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, +5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, +5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, +5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, +5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, +5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, +5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, +5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, +1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, +5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, +5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, +5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, +5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, +1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, +5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, +5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, +5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, +5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, +5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, +1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, +5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, +1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, +5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, +5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, +5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, +5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, +5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, +5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, +5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, +5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, +5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, +5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, +5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, +5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, +5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, +5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, +6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, +6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, +6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, +6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, +6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, +6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, +6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, +6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, +6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, +6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, +6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, +6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, +6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, +6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, +6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, +6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, +6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, #1024 +6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, +6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, +6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, +6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, +6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, +6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, +6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, +6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, +6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, +6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, +6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, +6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, +6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, +6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, +6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, +6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, +6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, +6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, +1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, +6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, +6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, +6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, +6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, +6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, +1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, +6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, +1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, +6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, +6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, +6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, +1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, +6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, +6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, +6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, +6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, +6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, +6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, +6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, +6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, +6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, +6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, +6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, +6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, +6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, +6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, +6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, +6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, +6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, +7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, +7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, +7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, +7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, +7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, +7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, +7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, +7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, +7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, +7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, +7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, +7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, +7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, +7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, +7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, +7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, +7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, +7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, +7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, +7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, +7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, +7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, +7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, +7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, +7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, +7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, +7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, +7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, +7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, +7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, +7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, +7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, +7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, +7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, +7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, +7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, +7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, +7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, +7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, +7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, +7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, +7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, +7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, +7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, +7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, +7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, +7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, +7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, +7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, +7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, +7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, +7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, +7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, +7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, +7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, +7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, +7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, +7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, +7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, +7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, +7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, +7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, +8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, +8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, +8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, +8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, +8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, +8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, +8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, +8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, +8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, +8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, +8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, +8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, +8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, +8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, +8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, +8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, +8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, +8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, +8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, +8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, +8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, +8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, +8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, +8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, +8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, +8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, +8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, +8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, +8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, +8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, +8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, +8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, +8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, +8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, +8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, +8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, +8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, +8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, +8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, +8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, +8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, +8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, +8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, +8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, +8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, +8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, +8736,8737,8738,8739,8740,8741) + +# flake8: noqa diff --git a/requests/packages/charade/euckrfreq.pyc b/requests/packages/charade/euckrfreq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c683612ec2726b5ad956d887cd9d6231d6f5d21 GIT binary patch literal 88795 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 + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 8102 + +EUCTWCharToFreqOrder = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +#Everything below is of no interest for detection purpose +2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118 +2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134 +8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150 +8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166 +8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182 +8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198 +8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214 +8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230 +8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246 +8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262 +8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278 +8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294 +8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310 +8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326 +8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342 +8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358 +8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374 +8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390 +8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406 +8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422 +8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438 +8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454 +8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470 +8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486 +8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502 +8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518 +8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534 +8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550 +8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566 +8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582 +8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598 +8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614 +8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630 +8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646 +8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662 +8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678 +8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694 +8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710 +8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726 +8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742 + +# flake8: noqa diff --git a/requests/packages/charade/euctwfreq.pyc b/requests/packages/charade/euctwfreq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d45972ea798b5f68564bc9ff18acd434982afc8 GIT binary patch literal 61193 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 literal 0 HcmV?d00001 diff --git a/requests/packages/charade/euctwprober.py b/requests/packages/charade/euctwprober.py new file mode 100644 index 0000000..e601adf --- /dev/null +++ b/requests/packages/charade/euctwprober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTWSMModel + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCTWSMModel) + self._mDistributionAnalyzer = EUCTWDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "EUC-TW" diff --git a/requests/packages/charade/euctwprober.pyc b/requests/packages/charade/euctwprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89e4aedba24e4f418330efee086c77528b10806a GIT binary patch literal 1197 zcmcgr!EVz)5S_IXr!B2oaXw6*O>k0K2Hdmz860lPzmIc*jCP+~61Z zEWUux;0Ku5O~Qe5aXjOhoz2d?H?!gIql2Hne!Qz-^Mv$$L1GJ1HN651KqH_KAlMJU z1ki*~gx(LqjG!4qG4}olOa#pYiV68+Py((6)De6K_y+Ky*n@fkdAvu*Ye6bzh4)CM zgF$_Nl%<#9maiZ`>cGbOQ4 zNg=?EfUks>2*Us{WQ%+`0vt03Y)7nbChRh+xhr$#Sjp%RK;}nE-D;FF<0M(g%LlyN zY?w$h&g{68%|GD3sGjlx^vWvqG>pi#%3R0v1*hyAvXa5}iRr4+Bu3AZ)f$&w`{e9d zQWK%4tFro7E|g7r^=VKRZL(Xbs8MCD5;au#dF9%5wpwSL^)ZQM5Fn1ku{abvwit|K zi>o0{J()8bkxOkny}a_}InevGc)Qi&38h#llnjQLl5N>2PHCB35HXjzX$Oa-^i7aW zR}Y3<2RGx!{4La3x56z~^N7T<5sCe17Bfe9Osbi0F!)yZLE@WJxtnA8<~081xRG+u p`7hk(?Zxpk#m%7OtZm%fWt{Clz;ir5_spI@q?~SqPK5gfe*pRl5u*SA literal 0 HcmV?d00001 diff --git a/requests/packages/charade/gb2312freq.py b/requests/packages/charade/gb2312freq.py new file mode 100644 index 0000000..1238f51 --- /dev/null +++ b/requests/packages/charade/gb2312freq.py @@ -0,0 +1,472 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312CharToFreqOrder = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, # last 512 +#Everything below is of no interest for detection purpose +5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, +5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, +5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, +3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, +4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, +5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, +5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, +4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, +4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, +4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, +4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, +3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, +6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, +4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, +6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, +4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, +4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, +4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, +5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, +3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, +4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, +3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, +4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, +4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, +6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, +6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, +5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, +4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, +6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, +4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, +5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, +5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, +5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, +6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, +3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, +6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, +4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, +5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, +6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, +6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, +4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, +5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, +4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, +5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, +5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, +4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, +4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, +5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, +4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, +4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, +5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, +4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, +4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, +4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, +5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, +5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, +4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, +3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, +4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, +6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, +5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, +5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, +4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, +6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, +5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, +6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, +4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, +5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, +5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, +3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, +5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, +6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, +4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, +6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, +4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, +4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, +6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, +3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, +6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, +4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, +3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, +3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, +3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, +4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, +2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, +5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, +4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, +5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, +5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, +5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, +4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, +5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, +4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, +5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, +1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, +3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, +4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, +4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, +6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, +4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, +5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, +3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, +5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, +5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, +5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, +3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, +5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, +5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, +3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, +5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, +5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, +5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, +6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, +4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, +6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, +4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, +3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, +4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, +5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, +5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, +5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, +3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, +3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, +6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, +6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, +5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, +6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, +6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, +6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, +6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, +6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, +5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, +6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, +6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, +3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, +3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, +4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, +4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, +3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, +5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, +5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, +5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, +5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, +5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, +4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, +5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, +6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, +5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, +4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, +4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, +6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, +3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, +4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, +4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, +5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, +6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, +6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, +4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, +6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, +5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, +5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, +5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, +5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, +5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, +4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, +5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, +5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, +5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, +5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, +6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, +4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, +5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, +4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, +4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, +6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, +4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, +6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, +3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, +5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, +6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, +6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, +6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, +5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, +6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, +6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, +3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, +5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, +4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767) + +# flake8: noqa diff --git a/requests/packages/charade/gb2312freq.pyc b/requests/packages/charade/gb2312freq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04115914bee774036bd26417c2e09ae5827baa19 GIT binary patch literal 68811 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 literal 0 HcmV?d00001 diff --git a/requests/packages/charade/hebrewprober.py b/requests/packages/charade/hebrewprober.py new file mode 100644 index 0000000..90d171f --- /dev/null +++ b/requests/packages/charade/hebrewprober.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .constants import eNotMe, eDetecting +from .compat import wrap_ord + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +# windows-1255 / ISO-8859-8 code points of interest +FINAL_KAF = 0xea +NORMAL_KAF = 0xeb +FINAL_MEM = 0xed +NORMAL_MEM = 0xee +FINAL_NUN = 0xef +NORMAL_NUN = 0xf0 +FINAL_PE = 0xf3 +NORMAL_PE = 0xf4 +FINAL_TSADI = 0xf5 +NORMAL_TSADI = 0xf6 + +# Minimum Visual vs Logical final letter score difference. +# If the difference is below this, don't rely solely on the final letter score +# distance. +MIN_FINAL_CHAR_DISTANCE = 5 + +# Minimum Visual vs Logical model score difference. +# If the difference is below this, don't rely at all on the model score +# distance. +MIN_MODEL_DISTANCE = 0.01 + +VISUAL_HEBREW_NAME = "ISO-8859-8" +LOGICAL_HEBREW_NAME = "windows-1255" + + +class HebrewProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mLogicalProber = None + self._mVisualProber = None + self.reset() + + def reset(self): + self._mFinalCharLogicalScore = 0 + self._mFinalCharVisualScore = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._mPrev = ' ' + self._mBeforePrev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._mLogicalProber = logicalProber + self._mVisualProber = visualProber + + def is_final(self, c): + return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, + FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] + + def feed(self, aBuf): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.get_state() == eNotMe: + # Both model probers say it's not them. No reason to continue. + return eNotMe + + aBuf = self.filter_high_bit_only(aBuf) + + for cur in aBuf: + if cur == ' ': + # We stand on a space - a word just ended + if self._mBeforePrev != ' ': + # next-to-last char was not a space so self._mPrev is not a + # 1 letter word + if self.is_final(self._mPrev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._mFinalCharLogicalScore += 1 + elif self.is_non_final(self._mPrev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._mFinalCharVisualScore += 1 + else: + # Not standing on a space + if ((self._mBeforePrev == ' ') and + (self.is_final(self._mPrev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._mFinalCharVisualScore += 1 + self._mBeforePrev = self._mPrev + self._mPrev = cur + + # Forever detecting, till the end or until both model probers return + # eNotMe (handled above) + return eDetecting + + def get_charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore + if finalsub >= MIN_FINAL_CHAR_DISTANCE: + return LOGICAL_HEBREW_NAME + if finalsub <= -MIN_FINAL_CHAR_DISTANCE: + return VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._mLogicalProber.get_confidence() + - self._mVisualProber.get_confidence()) + if modelsub > MIN_MODEL_DISTANCE: + return LOGICAL_HEBREW_NAME + if modelsub < -MIN_MODEL_DISTANCE: + return VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return LOGICAL_HEBREW_NAME + + def get_state(self): + # Remain active as long as any of the model probers are active. + if (self._mLogicalProber.get_state() == eNotMe) and \ + (self._mVisualProber.get_state() == eNotMe): + return eNotMe + return eDetecting diff --git a/requests/packages/charade/hebrewprober.pyc b/requests/packages/charade/hebrewprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5546eed61aa5e9307c83d88b135ca8667b394c5c GIT binary patch literal 3644 zcmcgvTW=dh6h3>g6DM(#x=9Fafr^_fL29*9)glljaojc{al*P6u~M~iykln*d!6h~ z8VW5Bw0{8!sXQSb5#oVAfOtgwf%3#Fh>KJ%FFbI*Gp_4UUfnozJacwt&&+qebI#a# zkRSX0hmYTBQ18#-@3*+6pR)-0-=a2A$0FY%3uBwwHgz2G9qPE`yGH9!J42l;`B@&b zdW6CZ`J)uFDo5c6`C}B0l0Qyij{FG<$H>o9I8Oc{3Ma^)q%cqZ6orS#KTP2y`2`B6 z$Uj2iVe+RbEReFOX;FBD?h@T0de@(!aGGkx8Qy4Qu_!|5Jd5&XJ*g?Zo^&@BPcZdfNe?a^R@fSpf zMeBp`U&z#XvTv8i}+BZAwgO39& za!c1)C<5jTIiJ_J;RtjbcmN%jLPt6o3SH@BfjJ&A_*v;N{v*=Kkyk6?j18DT11M!~ z={yTfv}MsP#??5PdjT6Fr~(&qD+A0yfSLeSEdo%F8)>{Z2%fm7@;8YPEJ}N6QfhbkO{I3UQQEnwH@ora zlV?j|lyad9w0Wjz5os zgB>vNfT7=EpV*>dpO}t7RVz9?xfAqnju_d+?b7 z#ykSNL1#TtH-s)hXHhkI2^4~q2a*jNr5xM%j9U*S#>i!qa89&7g>Z~p4^g^hFcIcH z)6-2$FsQCA>#q1$K`Hmz24s z&#~Z;;Ujaru&=dE+99UC&QL2u+u4Ib0<1Kkys%tdSP9-?E&k60LTKw31%JYW)V{@Bh?aspYTX2#>&?8Z~b zDZ-l!vBU3}#Us7`oZ$`Ui*1*Z>t-=$qEQ;(=9(It#hizkNj&~g#;_paQ*H5H zGFSs0S-ZGg=AgY)S@bH`g6hI*MHg6qb-8xs zpjuMC6nzk&(T$r?sN#l_Dj;iMXLW6EGk?3n8{ zYC~M_sDD_O9%n($6nod@D}(DySpB}sI^%Ir99|cXpXQG7IJ=u22v>9Do$LkTf0X>R z2AB7)SduHHY@*^w>HmaUmvfIVZ)@bQZh+;CAK`0&*angE4#udRYW zu2`OM3+ymqEy4T(hOa>2&5xWZz2RK<5WDxdrEqQ5%4Kt7e3fx?`P}QdqtzlVFme~c zb&)-8t^povP5xr)a{7vOYJ7lrmLC+2ZfB>irJQ*P4euxf(wlb-0zXYWkj8@r?->Z( z2jxoFD`!&Iy%+Ha0C+D$yaa(wKM8asw%#y)dlS1&pJy>;&014o)_Uxd$!4-PYn^`q D7 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JISCharToFreqOrder = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +#Everything below is of no interest for detection purpose +2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384 +6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400 +6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416 +6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432 +6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448 +4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464 +4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480 +3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496 +3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512 +4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528 +3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544 +6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560 +4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576 +6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592 +6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608 +6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624 +6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640 +6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656 +6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672 +3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688 +3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704 +6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720 +2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736 +4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752 +4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768 +4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784 +6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800 +3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816 +4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832 +4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848 +6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864 +4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880 +6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896 +3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912 +2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928 +4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944 +2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960 +6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976 +4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992 +6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008 +6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024 +6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040 +4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056 +6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072 +2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088 +6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104 +4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120 +6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136 +4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152 +4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168 +6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184 +6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200 +6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216 +3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232 +1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248 +3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264 +3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280 +4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296 +6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312 +3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328 +6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344 +3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360 +3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376 +2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392 +6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408 +6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424 +3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440 +6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456 +3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472 +6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488 +6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504 +6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520 +4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536 +6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552 +4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568 +3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584 +3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600 +6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616 +6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632 +4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648 +6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664 +6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680 +6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696 +6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712 +6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728 +6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744 +4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760 +4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776 +3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792 +6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808 +4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824 +2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840 +6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856 +6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872 +4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888 +2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904 +4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920 +2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936 +4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952 +4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968 +4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984 +6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000 +3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016 +6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032 +3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048 +6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064 +2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080 +3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096 +7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112 +2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128 +3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144 +3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160 +3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176 +3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192 +7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208 +7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224 +7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240 +7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256 +7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272 +4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288 +3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304 +3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320 +4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336 +3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352 +3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368 +7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384 +4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400 +7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416 +7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432 +7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448 +7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464 +7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480 +4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496 +4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512 +7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528 +3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544 +4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560 +7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576 +7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592 +4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608 +3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624 +3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640 +7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656 +4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672 +4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688 +4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704 +4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720 +4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736 +4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752 +7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768 +7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784 +7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800 +7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816 +7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832 +2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848 +3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864 +7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880 +7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896 +3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912 +4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928 +3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944 +3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960 +2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976 +7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992 +7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008 +4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024 +3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040 +3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056 +7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072 +7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088 +7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104 +4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120 +7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136 +2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152 +3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168 +4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184 +7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200 +4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216 +4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232 +7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248 +7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264 +5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280 +7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296 +7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312 +7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328 +7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344 +7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360 +5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376 +5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392 +7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408 +3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424 +7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440 +7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456 +3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472 +7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488 +7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504 +1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520 +3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536 +4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552 +2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568 +3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584 +2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600 +5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616 +4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632 +4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648 +5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664 +7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680 +7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696 +7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712 +7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728 +3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744 +7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760 +3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776 +7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792 +4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808 +7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824 +7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840 +7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856 +7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872 +7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888 +7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904 +7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920 +7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936 +7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952 +7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968 +7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984 +7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000 +8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016 +8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032 +8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048 +8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064 +8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080 +8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096 +8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112 +8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128 +8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144 +8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160 +8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176 +8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192 +8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208 +8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224 +8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240 +8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256 +8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272 + +# flake8: noqa diff --git a/requests/packages/charade/jisfreq.pyc b/requests/packages/charade/jisfreq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42cace1eaaaabdf27bf406cc081a5a13c4b1f655 GIT binary patch literal 84027 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
pz%hOmt_nzA~sq^G}_-f8il?lK+T@Q7>SGuh1N- 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 aF0#o@`|@%vSAhd6kbl5fZteUx71#wZxVFgv literal 0 HcmV?d00001 diff --git a/requests/packages/charade/jpcntx.py b/requests/packages/charade/jpcntx.py new file mode 100644 index 0000000..b4e6af4 --- /dev/null +++ b/requests/packages/charade/jpcntx.py @@ -0,0 +1,219 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .compat import wrap_ord + +NUM_OF_CATEGORY = 6 +DONT_KNOW = -1 +ENOUGH_REL_THRESHOLD = 100 +MAX_REL_THRESHOLD = 1000 +MINIMUM_DATA_THRESHOLD = 4 + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis: + def __init__(self): + self.reset() + + def reset(self): + self._mTotalRel = 0 # total sequence received + # category counters, each interger counts sequence in its category + self._mRelSample = [0] * NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._mNeedToSkipCharNum = 0 + self._mLastCharOrder = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._mDone = False + + def feed(self, aBuf, aLen): + if self._mDone: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._mNeedToSkipCharNum + while i < aLen: + order, charLen = self.get_order(aBuf[i:i + 2]) + i += charLen + if i > aLen: + self._mNeedToSkipCharNum = i - aLen + self._mLastCharOrder = -1 + else: + if (order != -1) and (self._mLastCharOrder != -1): + self._mTotalRel += 1 + if self._mTotalRel > MAX_REL_THRESHOLD: + self._mDone = True + break + self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 + self._mLastCharOrder = order + + def got_enough_data(self): + return self._mTotalRel > ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._mTotalRel > MINIMUM_DATA_THRESHOLD: + return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel + else: + return DONT_KNOW + + def get_order(self, aBuf): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def get_order(self, aBuf): + if not aBuf: + return -1, 1 + # find out current char's byte length + first_char = wrap_ord(aBuf[0]) + if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)): + charLen = 2 + else: + charLen = 1 + + # return its order if it is hiragana + if len(aBuf) > 1: + second_char = wrap_ord(aBuf[1]) + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, charLen + + return -1, charLen + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, aBuf): + if not aBuf: + return -1, 1 + # find out current char's byte length + first_char = wrap_ord(aBuf[0]) + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + charLen = 2 + elif first_char == 0x8F: + charLen = 3 + else: + charLen = 1 + + # return its order if it is hiragana + if len(aBuf) > 1: + second_char = wrap_ord(aBuf[1]) + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, charLen + + return -1, charLen + +# flake8: noqa diff --git a/requests/packages/charade/jpcntx.pyc b/requests/packages/charade/jpcntx.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6513fdadfabf57be38ae32d35b689f87c29b13f0 GIT binary patch literal 24910 zcmd^{&yU^LS;o)3Gj?LvuAQboV#1GPHxi05aJK$h8--}pl&P5=bX=-$7jAX4oR_1rMAa! zpYy!W`@HWt-|xLMsUolZ;QZNt`Tn2&`c_%~=P&u+U*pgG7bm4`vqojNlsltxb5us# z<8pIcwpYr{m9o8BZmyQ?Q|0EVvVFSTJYBY*I9yL2f-sK`Fyccu?>&2bVxv-SZIo?} z>T^S7c?BQ0@2uYUNhzjs=>+tXq2;fcWpx6`)+c;pD zWr`Tv)9vi&S(4&M5g)bx$DR4f!?SxW+!7APTohX{i@OCIIfz(30=HaCpZ^7z-GPk z+&mhwfLhB1JVdfG2%G`n3m{{8pF&T{1s=@bw^O44Pi-IPbEhNSf0EYnxpPZQWAqMSO6<%C zdS$jK!7eW$hmuS?w&3HFr;ADj*aDjQ{deA};ISgwNLy~1Lq=m95F=>65 z%3vEg7&uEGwzdurpw_H?iLUg*4UH`<&v<}*&m+){2%l)J0qs-&dMAnVt~$x3L>M*=ib2bHmK4qGo;+^L>D~3%QwQr+^jd> zD>3)^Qj%q1w$6|)nMXjD6cIhZS|W@wSq*JxDh@4m(X3J8j->6 z&_X6wq#&(=bi9<41;fW7peMoBl683~Yt4e~-nWYz*?it5kx|G+=}g4a@c>P~JSiBN z3{iigGRylc{%R0_^DH32FdFJWxwQaO8d4i3hUsFJ0x@nb+x3Fh_sDa{CjtP=v-AT% zvJFECKEx<>=oxJl=;`D{NET$O#39)tlT6C2Eu17R(4-cUWfz7d6&ad*-c4~o2*gG- z02hS-4SUb<$~1`#;4s!QiGV0}t4TC%w&gG>NALWIoikl1%;f4xF^RT-kjPY?J^W{x zxWU^Zkrah27-dG?dQY+DDHlLe6>RsO?EQ5}v|Y9VoR=zAoO>m`5V*p7ML4u3<0g= zgwMMz5U~1lQALT2KEb3|Y*`kjg-3vNFhOfw#gY~}rw*1QW(%*UF)3@=3Ubf-NP+_> zN34I-9638O1opB85l@yT2wXVyo?@fZqR&)%nhj>F002p}i-n}{ae)zl5m?@vgISsY z5U7V?!8kv>wF+9*^6Xai4)jv20|J;j38uR zA~vQrWNHQQ4%xR8bMT~+&F}MG3-=QT#qf~c8w`M`m6$E9!;>qpG( zr5#N40QD&pz^fsq@I%0ZW%aphMY&Vi(ZRrw9Fqk$!UQXp2loqy6w<;Hn1LaTS@}3X z;=qzoW0Y|WZNc75ADt>QB;{cFp2w3EGGf2rC5d7S<71(*FGQw>lq)65Akm~SGMVs* zgE^+PMz(e#3Zg^+qkuRlB-ND5&pY?V_W13=cyAHJ3Lb1E8w|j_&%!Vakwq5`!Gb6; z(Z{h-vQlMj7+a_(1)v31HWKR`jVU!Pb^q+7bifLX`M@D3avsWEwoU|iK+6?_15yZ} zBheJtIdgV_li-PoJ}|6wC*|ZY3W(ZzSBNdo3=J&LZj}zb4?J5JdJO@%L9&$rLmFYy zI)Z*w$kYN@4lE|?z;+?BWSk#?Ow2X3DUn{s2cRSZKq>8L23cLz50#X300BCYL^(e7YOf*Xh(iK~PZms0V=be=1 zL^ae}*hdOkVNfD-0C~D63t%}IGW{iq7NWP%EqJh;Cu5TZQy!UxFj~ROSVFnWl0(h% z>}<(Wk|=X1t0{caD>6OdRk|f2cIm0!Nl*g%Ib)(fTf6HMtd+eqv@osXZ&qbIAyMkq z$mQ9sf!x@fK;xCiQqxUozTU407+ zlLEBt3GX~_i&-L*u=V|+i)XPZBwH3f0<&R|Su5X{hZiuLS+<&6A`inP#6b#;dU$}- zsw5_biEa_VwCs_y_YU49RTdf@z=+svAJY+V{7zzG37Y6l^@6?^)8fX;K|HTMU_g$> zR&3Ttp`_<(vn|hlyjHO-P-Z+A=AP(8=lpxrWHY2n zBjs5Nj3EWIK(C3>rbGmN30X;=xL{z#mLm^_k?|@>2`I-6OteZX7=Z#XC17|!SF(KP zQ>(yoqPD$f$|WNZ7}03x=^!D#)bWU(l|oC{vV5jw z;{yq1`P8hXkz!?TNdb&KgNCgsovH1`3SemA0;B2OUm%Ru19Qc_VPAftxEFwFI$+p-l)~dxKL*3(=@k&4 zyz{0U)%z4v?!83-qbCALw_>(3M9bZJUYHcZ@brBF9L5p_FqT`WAdys_I8`Y`KzT~Q zC|S;+Avl7(^E#VSX2c=$py{tg+g>aln6QmTV0UfFswcuYh61tK@IA<5#C>9QyMKA)^J zu(iZ7GK?hI<152Q!+GNa>5@@{t)x$%ttVwWV5pMeGQlX>0&GfTtD9N}o!Jukn7d3=I?2In+pY^+$2C?Q#z+mxu1tW(9GRBBu6 z<#R`%8&N!PKnz24VWKk;oUxnd{lNwrwsrxyCYHj60f0ppd0T)X zEfnNuTz_`44wSI9oI-$}aYi7ok}A7I$=1X6k5zFZ4q&&4F(Epqyu+A+F_pm_4-J55 z7O{dvQq;yIpLfmU>9&ugTs=9!mJdj_^648!<%v}%lEpToxW32|yXZu{lV_FvXT^&Tg$FFQ;3h z`gCziRIJ8quMbww*2|3EaC%Jn&RVvR|aU=< zFrHeRXgO6ZNI@_R%X0~cPVPu-5z`C68jM7t{-nf23sWT^vYfw9X-mw}f{~fUlPrs^ zCV>3=wCas%p&O(Np5?g!kcpTFBk-gum3d^aq{p-b439tnX&Xj;|Bd+xUA2Y_)& z_Si8pp&f}HQ@vwbg)+05{qRUF0%{}c%i+BQqBBG$$iGKD;Iq}a_a`;j9$F12f%j-} zbGCjGtg;2i*>k1vM1XkUuPi2UKCwK%)8>khiR}(%fr(g&0m_o~)iokk8NF4E1fURJ z!<4ffFr+-1wUn?mDvsVQt&dM0rG*G!h=Tl1>r|!&5!)O}H|H^iVcRqCZd2=77z18U zqq2|`qG9Q5%+?!FW1#|Y&W>2DjIC83nP|4X^L*rQvi(H4h2~uO!&1Io$~SIObH2=Y zGe%|mlVS0@aL8T^%PF2J8*889FOA$85!Py0JW2T7gU!3s{e$hD(>3=a{Ou z2&)zGr|gVtfGRtu2#e1VUfaC8xi_27uI}$GX74Vp>}~FTYrZqj-%?pyyu_dRmk6^` z|8h#4nZEw@l%odt8!E>Q@RwAsG{E0ex!M4ib*h0U%4B1$4!2be5C2@P#-Aj-SIRr> zLPnTxv~#U{x;p3q^DW%gv&?6^x7PUI(!%^T(B*scgUh@7TbsL=cXxj0^4)JO-rnE) z!slPOyuCAD{LEivVr_&9s5HMrAQ7pRW6MH5Ih0sbIA%PBkevQcqYP!nzNo zKCQJU*e}i!rgv`aFE)24v)#pos(JH`>Gdy9uU@%v?JL(O-&lO2Nyu(&-nqLwTRh$N z>$BPRjs1<=J9n>gp7ncoTJ7}C>zngMWv(A=&kh)%lrL}Ya+mc%Oz*tBzc*{QI;qn< zvKyV$8~c6!%|N**>%NbFp@YFsaXZQeVYI-M%$j)KB;9VA7KH z!WK^v-njA`)5*2hr#D`iT-$i%`s*(*s^g7=d$UPN zrn9~MdvCox-QHYmeur^}-z)Xg&^`sf4CqgDu(sS*vVF5$s_!tT{mjNbPrHqJ8a_cA?O5ynXloyns_M4v%39^x%RRYRw~ede zA^(h+oWt{Ps&8#rMr-YZTEld@w|Qqao%&Tiy|cf4Zko;@om1xPfxz%SL)}S9$41zZN7@XTb7OZzO9W~7k;n1J+3+0@ZD?E@6=xj zWBlFr-G8b)!_SFZ)+-&I~lURPeB`Ah8;I(%<`wZ5r&g}z$f)cS5dTi;&Z z)B4W+cKwHn4|`!hIPrz$&7}B)BQNY<*UwS9eej_#Z2dua?1lYf$elm0;lFEW@9Lja zRNuy(zo_8{ga^L0lb^5Iqp$4b7vS29I(e>U`D1t#Z|CC(JwoojH2^KueISwZbGvl0tNdAxfF_tvJ z-h1!8YmBDY^4>S)(!HMNUGF=LS(@-=eb?Ii*?Zr+%y68a&ZJNFop%4Tf4HQ-vE%>t zZ!{Jac6VKY*6oee1@CCAp3rFB*;qZX(V5a{7caLq=Cvm_T7PWJYyGLw`g7q;YP9}R zczvIA>1kWE_chiN4QtGPq<%rKzLAi zNO)LyM0iwqOn6*)LU>YmN_bj$MtD|uPIz8;L3mMkNqAX!MR-+sO?X{+L+A)^3U3K- z3-1W;3hxOsh4+OIgu{g+grkHLg=2)1gj0n+VTN#qFkP4>94j0x94{Ou948zq94VY4 zoGi>1<_dF!dBSPJnZk#{Il@Q60%5)|K{!CzOE^&2TbLvqEbJ#t6b=#g5vB=05~d21 zg?)uRggu2R!cT->3O^TqDjX#ILim~RW8v4ruY`|<6NLSRvxL71p9p^!P8U8E)(W2q z{}BEu{7d+^@VRiKuv}OqTqbN5HVVHHelPr1_?>W}aItWMFe()P-{@)I{&mgKmBTAW zTkX+h&5@pF92sr*w_EL@{`RtFZ?tpcz@F2OShIM_hYNe!bi>NcBc1-{;Kjq;POo!A z`_g8wGu+eC>)Y*-B|`&)o$k7&?Ov}v+SOGryllnH`Sa(VHgj%IKL_>ewtLH)8`@o6 zep6?tHN2@ibM~CMvzO0k6hFRgA0b~CvC7t0-%bv0EvX90U#in3WP`FaKNZ2H-6s{G9gb;q5bhN260-BToAt7_ zcT3~gbRg>1^!6-SZ?@R?Nhy-C7dpNCZzsWJ6wSygrkHLg=2)1gj0n+VTN#q zFkP4>94j0x94{Ou948zq94VY4oGi>1<_dF!dBSPJnZoD7IfDO1Es!-|m>?V=>?Is1 z>@7?Z4i@$kCJKiL`v~9NhpPY8o}eE47nso~*eQ(d19__Pfj6ouRV%rwXsx`|4LlX2 z;rgeF>qdT~C1t$TvQh(85TMMKr?OQGl-a_qrBWf;$`#hCpTZ9StAdJWc3xOIxaGS! znF=hI1-D$PJZdSA%dcateX}PC%GtaS@VI^}AG|yoE)?AI+WJwC8?F}Iuw@1J|LuMi zP7+c$u`PqErIJIQll|tOIlm=X^?w;$foN5M`W4I^R!zBi^Vc&4DljdbaD%F@YXQeW6pN_k+1x425-jqtsNgM>xm$>q zyIIi+W!Zy;rGx91ezOJqW>LRkA;7+r*&Q{Ic zmw8KE??J%P)HOH`QEIK{6iX2Z7V@lsRrO%ydE>1Yx>+7@4K7s6LZ15}5ajIw*Y5JZ z)?K%r z{`%oeW4uOCsp@8r<2{ImRqb-CV7ZLb5e-v0P~k14l)EX>@vcCR3k8e&*>Z(bg6jZp zxZ!@ZOf8stqoS5Ij#A})Suk}vM+1B&-h%6Z-w0q)=BZLHf%3t}JL*~Li@GeFj^8k% ztjaY)9uwGdUMhvW`s02-D_AvL(g6BIWLbxNqPD4VA$i2lGVFO#|&zd1xn=0bim z!W%C4b6&Vm>Mf+ycfS+S>=<6qEe&sOa5`L~yoItL6z7c8f616$k_mlQ;)wFTJRZ@5+gZiI`KQVvm4 zEKl>$k^p0*-hv8lI2f)6vQ!w&t_84|ii%*75+-F90=r_R8kOs@M|oa|x=}b7uA`(d zl~df3Hyi*HVT>55HyMJdn*JkZKvCY=o6c@iiPk)RqV0R?L@rBZ`#Y>|%up zLKKx$MTnAuMe|z9Y|eZL5VaNH=A6WqK_2t@Ex6Eas8B(aij+kyQHD%esXTY{ zg|N7vRd9oV-Oz|V9JL!#vM$Ng20bRgBE^;i?h*9-Ml`tDKo~dV`8WY#AY7)hN&wSi z(amq=Gl!I*61w3!FC;T*Xh{zONck<)@|MjD_p|F{YO7k=`N{>{japp40aox^a6_J5 z_a!f7WmA|rlo4=`)cu^oK)9Adz*dlFa4ag^4Ht`K`lgiq<`kk-5U`b+FZE_A2M}Pi zP(i@S<@ZAwc?5#RZWWS4ZP=GR!kKWfoD8h&C>F`|<&9)2$ioVGoQ~%Ff{=`bRLXK5 z$w;M=!y9GHf?lwk!ds{at{agYETRnL6kJk5zzgz*#ROPRw(C6Lw{WWKq#X&TS0(iR8kgs?BTaCOHd{y zl#xfkRsdU4VXJ&dq9GX-lx^|5OMqls<&%cNzb7t-2wSp@1Hol;0$5y#T1QFYU?G5u zN=QyM=Z$2Vr=sPv5M`j$8$D8aj+VotIVB94a+x3%&8nm(K!7qVqHak5E1N>V7Bhzn z*$p51sg(cPTWVaE@fab6C{~4WQK^tzp5mVe;8QA9R-td$!^$bC)En})Qokz5lWZwg z2$rLi1(!h33vMXGb+_=}T56GZMQSvpY~fOi9w{k{JX`J-RLTRXJK-n`@mMDuU~Z^1M_uTgC(xEQaKW z;mys7G7EXUg{cTQnJ5-1wz7d#w^S_x^()Y`N(C@8efiHxhz7m#Xh=pr6&T02`cv&n zbN`G2!UVX^%XV`fa2~bUG6F%KS^~Tw@3&M6$yjtlAiULbY3>OC@-%l8*A}2JDXF!{ zE4NU=VyaMEK1Qvwpj_^9uwYRZrVq2!kD^>|p&Tr`yfIJ+gp^dbP?1V0f6M-YSlLl} zq%6+vDBW~vR#=}Q(W}**lUSfuEiLQUhQ9R$Li4Jw|65x% zd3WCSFKprv;TOcNe+fycZw1k+0@*SLh~o0*9$7a8QpsV+R7FS$Dxtz|eb58F@bkbW zCCq}$1VNcvtdNp*38bu)UMjD`TXy;iwe?dNJXnm8viNyqTRJ5rN<~n1fC}=0RiSyP z*zJDvLol2;{1nFM`ot)sLV!0cqCbeAkp`bJwLni_f4H>xlIfwjYZh-D9B7VqnnUM& z`&+A(QhbrLzC${fqOUsK8C%*M8dx^mY7h3N6wl{12a9i{);Az-YqK+LTgpL2;EEvb zh`ze9_@crc=&mZPzKz|{zQN(*`?325J8Sz!Huu&I56zi%YG139RH+6DZ av@v1owDS1>dUWcfNfY+i{=aG8u>S+CF!t*J literal 0 HcmV?d00001 diff --git a/requests/packages/charade/langcyrillicmodel.py b/requests/packages/charade/langcyrillicmodel.py new file mode 100644 index 0000000..15e338f --- /dev/null +++ b/requests/packages/charade/langcyrillicmodel.py @@ -0,0 +1,329 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'charToOrderMap': KOI8R_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "KOI8-R" +} + +Win1251CyrillicModel = { + 'charToOrderMap': win1251_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "windows-1251" +} + +Latin5CyrillicModel = { + 'charToOrderMap': latin5_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "ISO-8859-5" +} + +MacCyrillicModel = { + 'charToOrderMap': macCyrillic_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "MacCyrillic" +}; + +Ibm866Model = { + 'charToOrderMap': IBM866_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "IBM866" +} + +Ibm855Model = { + 'charToOrderMap': IBM855_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "IBM855" +} + +# flake8: noqa diff --git a/requests/packages/charade/langcyrillicmodel.pyc b/requests/packages/charade/langcyrillicmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9119a36eab523a5024e54a92fe9f768960712f31 GIT binary patch literal 30591 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 C3AkYZ literal 0 HcmV?d00001 diff --git a/requests/packages/charade/langgreekmodel.py b/requests/packages/charade/langgreekmodel.py new file mode 100644 index 0000000..93241ce --- /dev/null +++ b/requests/packages/charade/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'charToOrderMap': Latin7_CharToOrderMap, + 'precedenceMatrix': GreekLangModel, + 'mTypicalPositiveRatio': 0.982851, + 'keepEnglishLetter': False, + 'charsetName': "ISO-8859-7" +} + +Win1253GreekModel = { + 'charToOrderMap': win1253_CharToOrderMap, + 'precedenceMatrix': GreekLangModel, + 'mTypicalPositiveRatio': 0.982851, + 'keepEnglishLetter': False, + 'charsetName': "windows-1253" +} + +# flake8: noqa diff --git a/requests/packages/charade/langgreekmodel.pyc b/requests/packages/charade/langgreekmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2e14d611b621a621025a57dd29651f2482d241d GIT binary patch literal 24596 zcmeI4S#unB6~$YY?SLT=_I(YDSY#0gFM$LCAqfF5No*1@OPFXHd9W-gnsFQ#ya8cf zUU=qv0AC@WAYXtyK@|^BR9N~RIsD+%{Wm?C8OswCS5DpK-1EQpc28?mcJ<<)Z$9+Q zv%h|5wR+*dTdL~r#vWd1p#Ssge1pHJ&M#E`UsmV$Rf7Xn-9)}$9jo_M{U21v`cGH= zA2!}%)&EiB{kZD?q&jwfzlcpyk@(Xc;(@CFv+C^9ubRUK{|xv?z~2L&4|q7B9}xWv zz7gNY3fX@beBH(1ew*%G! z9u2q{uoduJKyw|c!50Gl67bi6y8_-9a5&)pfCmDO1*`{rCtxGsT>-ZTd?esQ0q+g? zYQR#!#{*UZJ{oW|-~$1-1$;8#g8{b&d@SH^0q+lZPr!1(iGU*k=K}5sxEk=9fY%1R zG2qn!-wjv@ct^nN1Ktp@81U|Zn*-hwa3J6n0k;Gk3OE?>&Vc;^FAsQGz^ejo3fLF$ z%7C{AyeZ(r0dEetJK&1}uM2ox1Eill5p+Zx3UL2hN^ZK5^pc9m~f@F^u;vdt_Ymy%IMiL&4to#5|Mm5&xWCyw zzNVwB#`O@qE1rbKIf{v{4?zU7FQdxtJp`xv-86Q(R5jm3^(}P|rm+b9#-ZO81adoo zet9uob9Ju$+F?>kh>Rr)E>gr~0aOsfYR|%(qD9YU=?r4H#l2WUwRDPWmfUReEQa1p ztnrUzXj!-#s~y;>@su#BBH4J7LO>QEGOk(eStC!!weHQey>xKZl~l4%w*>5r%q`9) z@{7zC%O*)=E0JE7AZ8SE;k8?o*%FmtSGp7ylWRbQCAzvC)U~2GAQNR$lqoAWyWz-+ zVy>y!LD@F4n3Y{$ml4cjR4k*&C9By0vWjK3idpvhjz95f#j%*pR$>+GFT4Lxv9iqN zpoz!2ZUWgH49#+^AtkJd zRy$*t#?7J^C0Lm8)Stz0EsF{k@-rTFCi0BRL|A0aQZMk#l4~&pNT6aBB*q$ADq~el zhpgF5ig{%*w2^VKkfK&GC|F7`ITk8dlVnl(|Fzopw+nmGePEzAEM~4zaBT$2pjb=^ z{e;kRl!a`1?d~pYmtoAZUX)dgDQ#2}pn@-k?8Q{%cKtEizQkR~GPw@7*~ntiq+)Wh zEK5Qb@)^&_P-LmrVz|^2o3W)M4RoZ%%%v+Os31X%p+zq4&k~fGXwjvYB4s8Coy#ML zIh4piZNQV8bx*BPY&l5rAvQ{f$;YqgAlgo0Xhy}dp-C_=6tZSz6va#ho~*e5jY{K8 zPWMnOMgohK5JNt*jK>-CV`U>KRs?3FHv9A-kgX0CYO%;-@#!Xp)m{s4iWUQAmJZ4` zq!{hunnkCUP_1GDc=Kr42sRs28ZX9K5f3m1$FIcEp z8Lr9Ch0D-b9VQZ`xDq8y1+rOld+W7dUv?l1x41g?g0d}jLnZ4}wNNOtgq<-LF2iU*xs1v-Y}5`3REmobg%03RYxgM> z8iGt#vFx6Nl37-fQLRLII)5?FR53A5m_zw8rbv0{HDP}Y&=S{vpX8But| zj0^=Uqhv8E#5>@+*l7J&*0sdU&u)-!r$WqL*#%VjUcva$Lrs#t>MATP^Y z%198C#l~5V$hcO~)yba9 z(;8L>ipaFa8N`f&d}b8|#!|`1#bI=0F-w!}l=dttnZ?azTg%AA+R5$N4k{*Kt_c*g zwik0znZ)97S%MA+QKrLjQ6X0BuSl^((N)5-oJInRELN7yVpN#LO-MolsF({63o{R68h>&tjAn&nOO4tU$D@HL+CtY+c*fEuM{!TO5l7*2LXUQA)iqhqb0eF>B;K z_uBhzCtgHx)tYjqlAWQlERhN9#b)%E{CkUi2`+Xi-hZu^PM>UEGQDy9 zv3vgeW!3Sf?dJW_@#<(##jCCF->&P6Cwm)fr#Acb`Y2woeP3_AdHHm_=7#Y}Zd*u7{)H%D*G=>g!&=URiHiT8rK;MPG*-fq19)osD;Sz5dj#jXiuMo+=A% ee-7?%%T@~q54GoC>e+*fiwieh`*Y|&?0*5Crl_L; literal 0 HcmV?d00001 diff --git a/requests/packages/charade/langhebrewmodel.py b/requests/packages/charade/langhebrewmodel.py new file mode 100644 index 0000000..d871324 --- /dev/null +++ b/requests/packages/charade/langhebrewmodel.py @@ -0,0 +1,201 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +win1255_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HebrewLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'charToOrderMap': win1255_CharToOrderMap, + 'precedenceMatrix': HebrewLangModel, + 'mTypicalPositiveRatio': 0.984004, + 'keepEnglishLetter': False, + 'charsetName': "windows-1255" +} + +# flake8: noqa diff --git a/requests/packages/charade/langhebrewmodel.pyc b/requests/packages/charade/langhebrewmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..884c0ba74e188a4b7fd1714207b2303b2743f457 GIT binary patch literal 23416 zcmeI4`aQ{r-jReYlMx$F5yeUgm6f>OSoIOM>s5u2p0?Y3ik>33l9hn3J(bn3y%no z3XcifgbRgHVVSUAIA6F~cwE>gJR$5Ao)nGAxgK_AHOAB7JH zUl2Yid|CLA@G;?|!Uu)-3m*~wBwQ-IPx!O&P2n%XUxkkgOND2JzX^XA{vkXkd`oy< zctQB5@Gs%t!heMS3U3t76y7GBD=ZXF6W%4fS$K!AKzO%sj_?NIEMbxGPT@_$TZOZQ z_Xy_+?-kxIyhS)eSS*|_{7<+;xJAhS-x}!MvEA+7_NmRiPS)Glo*rnt>0UOLb+XB^ zY-4-S>)t+o)|zLYf8o%xmkrc?@AiY!-Ldw>mZ^Ss(7i3&+8%VL26}Q&mQAmn9G~d+ zcW=lBgRIxrtOvT2ov8!;r57w;v0|WI^kP37Y-;b#HjT9MjgS3lcsUPMRxiCaIheIt zRY-nOuQiCH>Q@UD9$%}bHwv4DEy7L04MJPkAzUF$3Dd$>;VNOLaILUOI4E2vTq&#( zZWZ^#yw{VYeSQrs5 z7VZ`96Ydut5FQjB5*`*F5grvD6SfH#3Zud@VZCs^aI^5ZuuphG*eg6K91)%po)%vJ z6MX9Y2|lVH=pDi>f*%el-;I*90f>xxYR7l1o8DF7FtuSjoCbi;pHn|m-40)_YEk0Cuh=3K*5WpnG z3Uk(O#Y0{-n5<9K%992~a%w?*DE7rys466r!XC{i)^|TlmL`CYGvTu$V1?glTe1whXev4QFxhuV#WiRUd^Q1jC=X}$Frw&0B74ApCimR~^K2&*>ysCsu zU;8kFsue9yc4t!9GNn9tg_BTQSV0Q?QU}AwkoGaSO`_peDYNNh`h~U1O$N6rPv%T1 z=%nBF7hD-8H?qCwdN zBy$&h&hwB~A;l(F3nqaRqIk{6NsZRD&wKDLYo&atXn7vTrWQplis(#K_;6u*pp@we z91U;)25iOsT2^ca|q$Vg#Az;N#`AuQIl%fH(_(Idv^r>;@g^z1AJ+7}d=Xh)U`H49;Q>M<+YF!O!DTVVqdGU8&U7(Xdy@mhj0bH@CJdCQ-$fnkVLs3K9tLB z0#~F?T=+&|7apR0@TF==;YoZbqJ@fOC}TJKY!WSOH5-A{ER1FqP&gH3A%zAZaDvUk zff{_5-72VX>6(P3;RQg(hXBq*Q2{N@?21lWbXj4Np*bKWdqj&h`b9y!oiO zUpNV?vX)cGL(v6ASvZ(Y*QVYG$#gl{6>G6uYUZ$@P4a@73WNrv%x~qje7eH>Il%hd zDg?qIh&n(6@@R!`UML1MqVpmCe=CufKcz3ye^5VP8Iz4p6~|nv|4s z8G-Wl<;fMIq5YhiVddrN<{bts4^3eKhS1&uTp*=aiajKI|4D`*e>)I3fx2c|&tLu*y9!qk9zP~d6 zdcjxF*LPBm?(g?TC#Ldma2=iK?i!swIM_WkxqR70qn&PluyndTwx>Ow^+$WzzWrH$ z&>wx(qwj5Pce2rm{Q2D;WUq!;mUlQa@4G6u_D^J&>Z^16OSIvFvi}w>E{mS}u|*3P KE;!@(fBy$?2D>-_ literal 0 HcmV?d00001 diff --git a/requests/packages/charade/langhungarianmodel.py b/requests/packages/charade/langhungarianmodel.py new file mode 100644 index 0000000..6f59c61 --- /dev/null +++ b/requests/packages/charade/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'charToOrderMap': Latin2_HungarianCharToOrderMap, + 'precedenceMatrix': HungarianLangModel, + 'mTypicalPositiveRatio': 0.947368, + 'keepEnglishLetter': True, + 'charsetName': "ISO-8859-2" +} + +Win1250HungarianModel = { + 'charToOrderMap': win1250HungarianCharToOrderMap, + 'precedenceMatrix': HungarianLangModel, + 'mTypicalPositiveRatio': 0.947368, + 'keepEnglishLetter': True, + 'charsetName': "windows-1250" +} + +# flake8: noqa diff --git a/requests/packages/charade/langhungarianmodel.pyc b/requests/packages/charade/langhungarianmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58529924bb1a5052dc755db26a51ab304cdb178d GIT binary patch literal 24893 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 literal 0 HcmV?d00001 diff --git a/requests/packages/charade/langthaimodel.py b/requests/packages/charade/langthaimodel.py new file mode 100644 index 0000000..df343a7 --- /dev/null +++ b/requests/packages/charade/langthaimodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'charToOrderMap': TIS620CharToOrderMap, + 'precedenceMatrix': ThaiLangModel, + 'mTypicalPositiveRatio': 0.926386, + 'keepEnglishLetter': False, + 'charsetName': "TIS-620" +} + +# flake8: noqa diff --git a/requests/packages/charade/langthaimodel.pyc b/requests/packages/charade/langthaimodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6ec0220728861c5c111f9076e5dcc3a1f037f58 GIT binary patch literal 23402 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 literal 0 HcmV?d00001 diff --git a/requests/packages/charade/latin1prober.py b/requests/packages/charade/latin1prober.py new file mode 100644 index 0000000..bebe1bc --- /dev/null +++ b/requests/packages/charade/latin1prober.py @@ -0,0 +1,139 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .constants import eNotMe +from .compat import wrap_ord + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( + # UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self.reset() + + def reset(self): + self._mLastCharClass = OTH + self._mFreqCounter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + def get_charset_name(self): + return "windows-1252" + + def feed(self, aBuf): + aBuf = self.filter_with_english_letters(aBuf) + for c in aBuf: + charClass = Latin1_CharToClass[wrap_ord(c)] + freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) + + charClass] + if freq == 0: + self._mState = eNotMe + break + self._mFreqCounter[freq] += 1 + self._mLastCharClass = charClass + + return self.get_state() + + def get_confidence(self): + if self.get_state() == eNotMe: + return 0.01 + + total = sum(self._mFreqCounter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._mFreqCounter[3] / total) + - (self._mFreqCounter[1] * 20.0 / total)) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.5 + return confidence diff --git a/requests/packages/charade/latin1prober.pyc b/requests/packages/charade/latin1prober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc9ef3b30630f22a30de656217fc925e21eba574 GIT binary patch literal 3622 zcmdT`?`|7K5TCufICc^{X&OQUf=_&~kXow|RV7r>q%MIE`PaJ^#7XG5_}0lKXJ6{w zC=`+ph&%xjufdz}1bl&K;05^2tP@xHgOErn)!v<*otfL&`FrR8U7z^3&iUvOK^h$E4h2fI6pqi~&EDk27F-I|Z>>rK9Jh)I^OnIw5Xw@G68$bmN6I+FuzjV`)PtR%o}0&5+ZL8~Y`Y0)b3 zt=9f4yHoZT?>%f~xv_Wm)6QPHtxap7Umj>H`}$a*x#d!KATyJM&Jik0k+bqP?DBVyU!jptw5X{VbGFWao%qLO$}QeZtzhn1+>+s;QZg zS2*AjZ1xwN5jDkL!`XJ2_p|cQ+`Yf}VA0)?rQgJrE!Wkywh4zBIh6F%p56n^@a;%- zcww`6%JolxaC!nN&edZ@-|sN~^xN;~*dr@JK0@{?S~y0WeGv}`i8^=W)4L1D0Ue<{ z6zzF5h{;wYL&j;d?@q2V8;TcDN)P=S5h}G z5dY*bw>ydMZx^}QNeXR2GjJDw8lpMbb%!{;!8LpCqzi%MpOKgWi zNQC}JLjg3x1+d?7;^>A8_)?l<${mOyQy|X|n$riN62uD4Id;@!XRmMnIQQEZfBkUs zcpE$UxfafT9g;p-8X|u_ZnA5`TMQ&#Y>_$WNvvEal^(-sZA+ULmV?+S``tX#{f@rr zfHa^@%I-`fymK0wSrvHG92T#k=6Urel=xuS__;>W`1!_3(krur0$XXw((l4aFhY)U z_#VK>6v1xhZNTnLF%4g;qG~~HtmfAm>&+$X-Afn9f5P}E7uhQ@IqFL8h;f-5XM;41 z*K}Md$9=&G3wD{@NZSY-$%!^$jP#CZ|1NiSUh_5tei`>Wx)F{BUo(MHIx;E=z$LQdR}Z}ukA oO7i`Y%ka-WfKsyyFoV7|<5j$hI`{YQsQ>f-u!gU)*Z!5@A12d+(EtDd literal 0 HcmV?d00001 diff --git a/requests/packages/charade/mbcharsetprober.py b/requests/packages/charade/mbcharsetprober.py new file mode 100644 index 0000000..1eee253 --- /dev/null +++ b/requests/packages/charade/mbcharsetprober.py @@ -0,0 +1,86 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from . import constants +from .charsetprober import CharSetProber + + +class MultiByteCharSetProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mDistributionAnalyzer = None + self._mCodingSM = None + self._mLastChar = [0, 0] + + def reset(self): + CharSetProber.reset(self) + if self._mCodingSM: + self._mCodingSM.reset() + if self._mDistributionAnalyzer: + self._mDistributionAnalyzer.reset() + self._mLastChar = [0, 0] + + def get_charset_name(self): + pass + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == constants.eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + + ' prober hit error at byte ' + str(i) + + '\n') + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], + charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if (self._mDistributionAnalyzer.got_enough_data() and + (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + return self._mDistributionAnalyzer.get_confidence() diff --git a/requests/packages/charade/mbcharsetprober.pyc b/requests/packages/charade/mbcharsetprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..895eb948a6e3de0d06c7ecc601810bd26913709c GIT binary patch literal 2580 zcmcguU2hvj6uq-+CvnJEQ}P8Baw$R)617wb@lx@Tq*W^=rmRyTBB9mVJ8{;rcaxp5 zXdrniQXhEYfj_~2;TP~Tcn8k88#jbL6WcR;_s-0nbI;tl*WsV@v%mlG>(@QG{DgRZ zf#x2gOYt)@6ghwpNE*t}$S9D5Kn&k&G7M!@lY<)G>tbtiXe6DIpG01Ye0xym^3LWo zOl5!L)6NXUO?JM4u2yCX^08$-?djM$?^>@lJy=ds+ZuH#IqOgK4DO$tMGT4$&>Z~`GjAIB zzR6gG!E20xu0bH>hvWwWs6<$pTK)X)pZ0Mv&eNy9(ql^L{cY$qO2=ghtQxHV9nnlgm)Ki+>5J;KZGPL;O_QFlwW z#)p-#3rM6jL&UOpX>wNAh>tf5Gj1U5@H|=Vv_y%SGpqP6GARe|iN87HiCD} zLa-97K)+&^gC2dDv~Aj9;bpYrrzyIlS+uRSOlgna!;BkEt=#ZAu~qp=|3hfl#G1NL zMzuu7qaqy-Z5(TjikOf!79(<0p@wi1wSYM9p*iB3GL5OmOe1VGt6*aGMKT2>cAk7+ hE3#VCBAU1gAC>;ElCD%ftjPO}TsvO+Ih3xY@E`OoDEt5b literal 0 HcmV?d00001 diff --git a/requests/packages/charade/mbcsgroupprober.py b/requests/packages/charade/mbcsgroupprober.py new file mode 100644 index 0000000..2f6f5e8 --- /dev/null +++ b/requests/packages/charade/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self): + CharSetGroupProber.__init__(self) + self._mProbers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/requests/packages/charade/mbcsgroupprober.pyc b/requests/packages/charade/mbcsgroupprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43dc4f7e8f572b0f301a230795432f7c9e9ade1d GIT binary patch literal 1318 zcmcgsU2fAr5T3R3U1{=-nCFA-rx#c zg1c}6j==?(*>#JRcd$L*WmWRkEr?pyZ-8in>_F79eiK9&WDlaA^*s=G zK=vW(TfYTj599!%0s3v=3>FO14txXn3h*)7hqMdfu!rep3}Hy1_YuaIvpnSbG~X24 zNxqr$+`en$yNl`T<6SO1dlOc<4#vH@7@tk5WEaWP(czQFhgG%=eH-kO(0MP`qv-#M0KTG)3fGac#w-U5bmv5LYmuLj2_yD)+@EnF(KHbANlS zFE{JMgJ*u4Dg9_WORi>1uKb*TD!9_hzhx2}ido8iIZxD*CSz+R<6wIokTeg`)I9`X zJ*UB{ci$OO9c7K{ndEV-X-^!>Oo)Zzv^AKt~)3_jI}4Xl)B z)uChyy*Rcd8+}XxYL%&yqi<=NM_weWvNuLPO(HMnH27sGDRUEgm6s%`XUJrWgI|)Q qw>fBzgI{ta|IKdwxguwWA6h6+yxj;gol%_NdLfI~QQHUU zV^!+^K1N@l=dwF9yS}h%Ct$+j)#S|OeDj?%XO3rWFT?*$P5%AwUq9C%`d0w>5oQ0E z2>^{(0h$0i1yBXp83Hu~JHw!cp`b5;8Ub$zyaHW%lx3{C*D!eQC0#sTv`kr_1vLu# zGN>Xn5NZT;5tj5A=y6!`uxA4Q6hTj7;|b6wVM$@%6;R_Lg>Zi1g4$!$uBYO3Txue_ z>{?})uhBL1-ComZ1nf0(tB~l8L)9OHngD$j)FeA&T%2)QoPj;$j7f3E8F2>sR&MqC`Q*wS?Jqw#6vP>hz)EaB@a;s)Yv6dEKBh!n|s=ORDgTmdriGU!E6S0Ze*5+~slk;+6Q$QKPpyE!CG3kuXCtOXgZ!OPKd zWtq{mh#;8MWlX#Z`W~ojY$7suOvD~C@tT;3VMQih2Ynw@DGDTK%{0asW&}(T7<$M{ zI3l}F4sdjZY^;nHzD+c??P4_7+!$Ktxr|Dh@e;TueAB4lnDpbxd(o8=T!x`mn(?$o z(UoSr8G~9z?jmFccd}X+SnR6*1L_9o2cT|psFoyDF{x1c#vTgQn-Z$HQz=w$fxZZp z(h{Dq8hFxz(l8c55eu&pRQCfBSNHe#_C)z?iA z4^0SkB5HeFtpx}{WBi~RcswRJN!{Dk{S9wd8VGH<@#aB5!ftiPYY>&j7!~7G;2{ti zgc1<`%JWC}ANe$7^~K7<+H)hWZ~8R+j|K0bwh;Wz)SoOb-n+XP5JF|UQ4e0NJ+1Jl z7h8`P?k+8_I+cyp22pPi!NwF7(^QDB+?%J!UXppcgnT4hoEI-` z(T&9A zO?GsSdDcxFtW=fb<>735yXktwV}KrYbG7hh>0@++jhucYPRN`Y`a$WaYj;mBWxSE# zbTgO*Eq96EtP`usfy5z2#Pi#5e0NElc=GD|cFACFp#-bMKFU;0+`?zlJ?z2x8Pm=3 zoCNu7!OP8ipFPeUd%hK-zlBt8rD1JGTUvr6|fx;=q@ zsCQU<_DLk(gAyn6o+iaFQ9!4=Hn2 zga1KtKWmgomL2ywZR}4oS$1?uj~#i6%$Opr!`S25-@M+hhNYWJy{vTKtJVELpS{%`Q!#h4SPM>+)|P`N^8@g?;XZ zAHGREfn&T@qGxgBtem({HbdIRqzx_`7RHIC+o;Ts3Dx#?@nNOiz~3aeO`2kpB0eBn zmY+U(@T%7I1M(49{2(Ac^!(C_`%n{^N{y9g&-S#}WN3bJiPZ^9YN&rYs>A@u8$85C zz$c#8o*M+Ig$P_}LEzQ|!uqC*fHjM-zS$08eKUcu_0mPannl=p*$!drWrRS%AP;3R z1cgdiMT|4176YM3kUM()`H}iKCJ~cM%u*T#Y$yydDU SB_ENOUGH_REL_THRESHOLD: + cf = self.get_confidence() + if cf > POSITIVE_SHORTCUT_THRESHOLD: + if constants._debug: + sys.stderr.write('%s confidence = %s, we have a' + 'winner\n' % + (self._mModel['charsetName'], cf)) + self._mState = constants.eFoundIt + elif cf < NEGATIVE_SHORTCUT_THRESHOLD: + if constants._debug: + sys.stderr.write('%s confidence = %s, below negative' + 'shortcut threshhold %s\n' % + (self._mModel['charsetName'], cf, + NEGATIVE_SHORTCUT_THRESHOLD)) + self._mState = constants.eNotMe + + return self.get_state() + + def get_confidence(self): + r = 0.01 + if self._mTotalSeqs > 0: + r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs + / self._mModel['mTypicalPositiveRatio']) + r = r * self._mFreqChar / self._mTotalChar + if r >= 1.0: + r = 0.99 + return r diff --git a/requests/packages/charade/sbcharsetprober.pyc b/requests/packages/charade/sbcharsetprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05f910351ceab1a36b46ad6d37033b86da6d2108 GIT binary patch literal 3465 zcmcguOK%%h6h1S4Bz9hXBu&FBR-wW|Z7o<(Aqr`eIBlfFPRA~&me6S8xwgj{dz`t~ zO#{h_{)H}J&4x|?3BQ01NQh-YMcuF|-#O!?4X<5m`yQWr?&I9^-SfDqKc@0O{P^&8 zlSZEu{;#9y2OvIv7KKC&FgE!q3N7l{)Ue6oewxA*_0rTxC;beC8R})JkwqVWW8{xf zW1RePYUIezQ6o=&o*EP6Pf%l$)Ff|vzA;5UI%#TIftm>TBcmjZQ>U5Uq5)xTefj9Br#O5syQ>7kdLYiv8d^Isv7L+AaA!UTS~) z4S&903jX9V43U`!sRjLZsFwGQI0Jv_@4~*-YG4Av>BVUCkFTA7fsaPxDOiH)n^;80%$v_Y*txS=RW|(Ld zwnW~O9eC^bXgzP&KVDr#kA&zNxYAI^r7&uGVJQr@OM`vWiTWR0xmxlAZ7vVI=8o4^ zx)iJ3q0&Z|jwMapsOPJa-ewMm8OYsU8SFcJpv!2QHIp@EXGq6h)?v{`$jjl26VV9H|%f( zyaJHfE_O!E?g5Yi@F^iav}6?NHbod67d5%RjUoZdXkJDqNdNMD+AQ{(Kg@^#=Sb7SK?Wy) znhPT}946h|zfa$PScJ}@l!r`H&14U zcG5@PQw-1H7#)le!ieSHS-j*7#SblWmb$alo#TAVYjM~t4m(CIo6Z3>*2Rd7Ha!yu_w_rNd{Gxr*jjPv+^Rp@y4 zRKeQ|`h6AWowJyzKl+c^+bWFq3Vqe~OmI)>P86Hw&=gDu$-L8vLLYnPi?3m|#FTjp zTq_81T6Zr%ULG1(B{sOB7@?6Mi9*$vvde*qx@(lf!61gz?rttuH#oVuRcE#AIGp$- zzH2u&w>HXdZM{);&OqpJ@^d)89gZqzh6x%;j#I13sHQ>bO=|G6Tdq{^+`Q#F#OZyTWrz$+OS9)r0G~H z+Fl$OWjMCg8uGHgZbrqj#>~jiY2`VpAh2#{XIhLd(>&)?r zWKmiwGoCji8CLFOD8?2U-gnoR6v)p+zRpVftJz04fBy2pl9cB*MELx^WajYKtM3m2 zJV3T09dKYc2#=`E(`O(3wv;@W#4*_?^RV?VisChs?xlgs6E+1z_Y$q5%QfH&JwcHp!zdJQBGz~pVqm)?we z1J6h@a^BztoX?yBlXsbLYH%1c=Y1xu^%Yqt+2mSs1)shNz4{!;Bpy)s+F4xT(Kny| E3oVQ8DF6Tf literal 0 HcmV?d00001 diff --git a/requests/packages/charade/sbcsgroupprober.py b/requests/packages/charade/sbcsgroupprober.py new file mode 100644 index 0000000..b224814 --- /dev/null +++ b/requests/packages/charade/sbcsgroupprober.py @@ -0,0 +1,69 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + CharSetGroupProber.__init__(self) + self._mProbers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + SingleByteCharSetProber(Latin2HungarianModel), + SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + ] + hebrewProber = HebrewProber() + logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrewProber) + visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrewProber) + hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) + self._mProbers.extend([hebrewProber, logicalHebrewProber, + visualHebrewProber]) + + self.reset() diff --git a/requests/packages/charade/sbcsgroupprober.pyc b/requests/packages/charade/sbcsgroupprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27bd1c3f57235a32636044b2dfb2a79e478433c1 GIT binary patch literal 2003 zcmcgs-EJC36#kYqzXpTxU(%}gs8LPq3MUs)RM}FKs7=%^k*dzkYJmx?GqaGLA+06n zDt(1KR$iceh+gysdd>`sO%?U71?F&mXU@+z6aLj|eEj3Xk7KMpA^m?t%luAcLcahC z&;dk%faMZY2|9!by&OVqL6;%Q&=rUZbQPisU4y7W*CFcA4Ty&K-h$eOZbCGnTM#X; zEko@jo*Oxz|Z0{Oqv+>T2x*d5a}_oT_P8=Bp*uqB%d!AKjia~%)RZ1Y{N90DtUfo z<;rX2P~qTxB0r_s$?4$a;wn#-O2^OV6RB*24BySuhq)K`Nc=vrX*Sq&>yZ9=GTu~f zlk(X}KRi40!G$~+IJs9MyX8o?!Z1Z-P^4VhzR zt6<6nQz@8g!PE+-UNDV<*)Eu7!L$lyr(oL5Oj~?>+=1O?Xuk8OcVYK%9pHV4ca#kM zNV8vPLS`-xa9zSRC0s&4TU>TUuC-K7FHe>lT`Ky)L#Kq*2TzVYi0*zF!EFU>@h*^PyFO`~4({Z9U zK*KlsZEBXA>K8QWBva@-1di!(Svx^HXq0-~{ncc$ zM9VmKPe{ydS}GFV<~KF`w}tSGzNBRs7?t2f?{m(M%j4>4G`9-(nBr+uN4(W{#6ioA zTP4|aym}tp*#8}HmLbJ4Q-0ZeK#f!mgDwj;j*4f@JFKC(c9<3Km3LSp)-r5)2TKo= zw>b=R39R-Q^9Bdv8{n-9bNJ>S{ZI37xOhYv5fUDMLFXDCMJMP4$KheXU* constants.SHORTCUT_THRESHOLD)): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + contxtCf = self._mContextAnalyzer.get_confidence() + distribCf = self._mDistributionAnalyzer.get_confidence() + return max(contxtCf, distribCf) diff --git a/requests/packages/charade/sjisprober.pyc b/requests/packages/charade/sjisprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc7ad9afd004803748a93eb589c1fbce1037f457 GIT binary patch literal 2968 zcmcImTW=dh6h5=Q#CDUWx70~n(QuU|)LI}A5~>i?Y1N=6E$bk_5?VIiNwUs*H`y7B z1e&KJUU=qD@Ly1$5kG?;0N*!bCn|Z4?HQk$bLQOVoT>b?(E9W5-@h8l^i#qA=NRT! zObLEUGLZp*K$41NO2&Z<0#RI7C9BA|Dub$D*CeaSxGsabU)Lp@lW{`^4Zog~tSRG` z3|fBOknEC-=VdUDbyIX8J4%w4{37yFDa;=**vJVslvJ#>TldwlyX38l8HVnm@!aA7j$+E6f#| z3y;E70u_3iK$ZR`P@|&>)Fte9YB)J0AC3T{hhfOnij0)JfbWzj8;GqC!aAyottg3-aDzLeCYLIKP0o_d4wVlv#5OQRQJSYVib4tutK23*G@g2QBcv8C9?|%mM}N{~ zSRwxE^vsz*fr45hr8e4nCz89-*-i)l;wG~Rs5>!bH!Fs5*3HuG?!mF$EAkKTf6`45 zzo$Kf1UzK3CGho}X$sOIrK@6|Ve ze$A_NS3ocS&ttUEc`RgZgyicC3g-!7T%0i!cn`zScQoeI492TB!?=sYKy6xPYX8al zMOa6-eIIHey&1^C*wU`U7f6#Y7GHSDy~2`Cm{B0eAt2D>(_|=m%wS zWsuc@ybNUR`)BH;;*uCq0RTirR!Ccw7s&dmjB2tUNco$C>r(#A^dB{t^$cc1ujIf|-#@Xd29W|WQ! z2WAwo55I5dLs#0DXX+`h-c8y;kF=c;uV%uRxnKI_%8cfg>{q!-`k9LkU(u(u#j)yl zcn>#IOk!?fTJ<+{buYE6x-5%wHMXnUsP3zV`Pp*CKV^=j6-=Gmm{8+HGM)QE66d=* zY;c=5Fh}8zP>-z+S!OIVOFtrG2S$nBp6ogX=GeF`V-pB=ynZZGoV(0(6oEeB&u_y~)qYaP17)h8!1emL3jz*8tjf2X(-Y-y)0)LG4|3yO=aX?G#`BMkE?CP8Vw ziSMFns%G#OR#jK9IkRwIRc$q=R)V&=u5PQ#!BVh<{UvoR7}5+zkE4fS-p9lQ#Lw06 z6C^v}SxHBQLA3o1z`dLGLx#i!Cw!Zb3k+F~aA~Asz0FJBzD>E~5KV&37?e_pPhu zT(jD&G~eksMQ#A$@_M{IZ4$mH_~!^S*(apC4`ctPa}N{OTX 0.0): + self.done = True + return + + if self._mInputState == ePureAscii: + if self._highBitDetector.search(aBuf): + self._mInputState = eHighbyte + elif ((self._mInputState == ePureAscii) and + self._escDetector.search(self._mLastChar + aBuf)): + self._mInputState = eEscAscii + + self._mLastChar = aBuf[-1:] + + if self._mInputState == eEscAscii: + if not self._mEscCharSetProber: + self._mEscCharSetProber = EscCharSetProber() + if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: + self.result = { + 'encoding': self._mEscCharSetProber.get_charset_name(), + 'confidence': self._mEscCharSetProber.get_confidence() + } + self.done = True + elif self._mInputState == eHighbyte: + if not self._mCharSetProbers: + self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), + Latin1Prober()] + for prober in self._mCharSetProbers: + if prober.feed(aBuf) == constants.eFoundIt: + self.result = {'encoding': prober.get_charset_name(), + 'confidence': prober.get_confidence()} + self.done = True + break + + def close(self): + if self.done: + return + if not self._mGotData: + if constants._debug: + sys.stderr.write('no data received!\n') + return + self.done = True + + if self._mInputState == ePureAscii: + self.result = {'encoding': 'ascii', 'confidence': 1.0} + return self.result + + if self._mInputState == eHighbyte: + proberConfidence = None + maxProberConfidence = 0.0 + maxProber = None + for prober in self._mCharSetProbers: + if not prober: + continue + proberConfidence = prober.get_confidence() + if proberConfidence > maxProberConfidence: + maxProberConfidence = proberConfidence + maxProber = prober + if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): + self.result = {'encoding': maxProber.get_charset_name(), + 'confidence': maxProber.get_confidence()} + return self.result + + if constants._debug: + sys.stderr.write('no probers hit minimum threshhold\n') + for prober in self._mCharSetProbers[0].mProbers: + if not prober: + continue + sys.stderr.write('%s confidence = %s\n' % + (prober.get_charset_name(), + prober.get_confidence())) diff --git a/requests/packages/charade/universaldetector.pyc b/requests/packages/charade/universaldetector.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2ae129c5f21c7bc8f0ab67f367b95f4b0f299f7 GIT binary patch literal 4267 zcmcgvTW?#(5uS5+6Di7~t;DvZIAL3)W!orK;dX;NJr3y@^@(1IJb20`&0QHSP5 zI=gIT)NTW~E&2z7pn1(xpZnP7py)$?L6HAYpzn6SZr1Ryq^X%}Xus`Z?(oq&q3K$?>{HsTC!hklK`l5WK*3Yts@Iq*jt} zQbLRu80+^asc18P(@8N|>=_nj1%rq#9W_rSD``w@C@ zmht4VCl5vH{%FJ>ji{%{%1BF8CQI7R(W3NPwUWX@dnN<=%TE@b-ZNRWD)SG2_uKDR zCb$Q8Od^}ZU$fsmjysX1Me0X!>u5c;qk~$SyB?Y5cz}BE^?Q-ML{9g-3Ee8)|1qnv z)FX*ZWSzIThKV|d75s}5vyax|z$A;EezVb8?8FC)#}DjLzqkDEj~2t&*oEUp^M0ch znZ+bJ8AQgK#qmfJPHcqH;$Y;baOkIZu?CM@ugAUE*6Rysn*xYRQ0IW?1yo$1xLG&rTz$w!#D&l!fk;Kr$7QSEFBF~4?0$@ zexuQW*=g{QPGjRvGH{NscdNFMSdF!M_oKeuY}ke_AKe}#(a%gXj@1=;j9zRs_>swI7bk8nQ%^p|E9vYOfMD&v{Hw!RkH9>$w`&WdA!v?<`=9v<+Pnp z;Z+p|biZ8K=@6$!;icUsm!;;)j3x>^tOMxIgj5Ds1kLBNW1qF!*79fm(3HEJ3iU%#~*%y69Wg-#tOSXr*`Y@Hie-_n_s z0FR5XxxN+fNWmP*ED4REY!fw-=8=MHbQ4+i;DL<-mNmgVMc9gvJr!jgiqcAIhQlZd z19Ze?fE)cmFWk18T3eB=Gu;8y>%B%dvKJtxgX4@4@Fal(F%KTFz|eBT;WBq=tPc)# zr^XJ<@&*O)ymE}@CLiK4fLvg7-b?#MFAJLYXZ$&D^pyORm-9;g=--WB^YdO==S(AY z7rkk3)|>XH{Ar9$d-Glj7=IZ(_KT1xc~|kwpr~MI76&lihm}Q<}J0+)^s?QW+ z`N#4I6+~LhU*+U81srH{fx+)e1tcb-=;{EuIw2iOs`)KQF@e2<+NHq)l{KkE67Sw-FT6X&3xUc=6YiM9lP P7U5g>E&A>bWK;hI)dyCJ literal 0 HcmV?d00001 diff --git a/requests/packages/charade/utf8prober.py b/requests/packages/charade/utf8prober.py new file mode 100644 index 0000000..72c8d3d --- /dev/null +++ b/requests/packages/charade/utf8prober.py @@ -0,0 +1,76 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8SMModel + +ONE_CHAR_PROB = 0.5 + + +class UTF8Prober(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(UTF8SMModel) + self.reset() + + def reset(self): + CharSetProber.reset(self) + self._mCodingSM.reset() + self._mNumOfMBChar = 0 + + def get_charset_name(self): + return "utf-8" + + def feed(self, aBuf): + for c in aBuf: + codingState = self._mCodingSM.next_state(c) + if codingState == constants.eError: + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + if self._mCodingSM.get_current_charlen() >= 2: + self._mNumOfMBChar += 1 + + if self.get_state() == constants.eDetecting: + if self.get_confidence() > constants.SHORTCUT_THRESHOLD: + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + unlike = 0.99 + if self._mNumOfMBChar < 6: + for i in range(0, self._mNumOfMBChar): + unlike = unlike * ONE_CHAR_PROB + return 1.0 - unlike + else: + return unlike diff --git a/requests/packages/charade/utf8prober.pyc b/requests/packages/charade/utf8prober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69f2602bb0c77025ab4d7e2d16643efd34e50447 GIT binary patch literal 2363 zcmcIlOK;mo5S}F^`4QVOoET_|qNfxU3M2vo6!D>mTgy%zAd+3uK~Mn!Lz63+79SRO z1vrI$YVSQY{TKNsz53Ei`U_g1f1vZt`T?V7QQG0`gFExhd^_v^yS(_vpTGT((B=ZV1d$k3fl{8BvUNf5Ek8}DvgaxYuwN>4|R{?I@ET*t`2qWhSxA$rCB)& zZESTfPL8rtySY0&_v+yJM%e3Bsm@2-<>%w3UE~)g+(y@sVS0<3`I?0$AZ4KJ>A(Yg zC_ZpQX;A8m(xkK@N{fQ9-Q+J5?1ScU>vA(+v9LtPiq04|$Ip6XeQ4Z|8j#0L!~=m1 z#rb}_#UBL{jd|9hC@V7?MFBPqd~665QE>^rXJNY5Mq3BI!Cj;CVVmD1!t`0|OikU% zt0c}ld3M-2d1sHR^2y_;oisD{(Mg<)LSloGj~~Yl)^D8^{I`x+E^WMk1V*R zcj~&To!YN#Pg`&xDx}W1;TP8MFvzE$SJN_mVcj?{sja=oUVkU*?tT|U`@!CpTP5+u7Sl4%##$nr z%`~FHI$PV}W|mlxYH<`Fs1-HuwLwCmTqGwuirhUA6;(RTHD3^b<0>YY9efIb?QR?v zZ5FoyIQWp8f#sH3X!6frxYuu^&o=;j0wHm}EKlw#arYcJ?l>!_qHuS)+<0=Xio?X1 eLN34HGi(NXvxgH`k8SDzYRV6>K<^KmJxb#E- literal 0 HcmV?d00001 diff --git a/requests/packages/urllib3/__init__.py b/requests/packages/urllib3/__init__.py new file mode 100644 index 0000000..55de87e --- /dev/null +++ b/requests/packages/urllib3/__init__.py @@ -0,0 +1,58 @@ +# urllib3/__init__.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +urllib3 - Thread-safe connection pooling and re-using. +""" + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = 'dev' + + +from .connectionpool import ( + HTTPConnectionPool, + HTTPSConnectionPool, + connection_from_url +) + +from . import exceptions +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util import make_headers, get_host + + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +logging.getLogger(__name__).addHandler(NullHandler()) + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added an stderr logging handler to logger: %s' % __name__) + return handler + +# ... Clean up. +del NullHandler diff --git a/requests/packages/urllib3/__init__.pyc b/requests/packages/urllib3/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8885b118202ef1e10a9a13795bb27f129c14086 GIT binary patch literal 2125 zcmb_c-EJF26h31+PU6J*k7*!9D^Mf{$@WEW5JISJC{3j{3L94~%f+(YIkq>M*>z`T zLxa+*R=fdk#T#(PEARkt&a4v)#AVl-<2gSw=bQ6a|Et~l{g2dZk+iwE=n)qRonLf!YGS4be8}9f)>Fx&m?))GkE3aJ2)> zwwcu(h&mu%ndbfb&lP zJFKL=V8uSj4R}w_zY9Nh*y&k!lVkHGkydGx%3j?IdckmFFp)i*j4()xJjc{!MIKCx zLS^|lNOBn%?3I?7e#>_0@Pk|$yb4aync_0&k_EB-sb}xoN%Bkab3aFS=;~zr?8(so zOT5e|DbQu1+ahv29G)KCIy@zRZhIy^`ycrnTRbv_j_CzmzRR-^$BMPDom`fs79_y8-r6K$os5AFDU(Db@R8i(A z#BrWzjANgvIM#(M6|vz4>E?L+?n8p|k^PK(ctA~&a=^Iyc=^EnL>mWiF2L2eZQjy` z*gAL7+ZtTg;Jo1_3p_^1fLrUDTCK^t8)gx%tEOYk5|0|Xt>d*dN(y_kzY=K$^c|y` zq6w%JgV$x2UZ|@ekaOS8J^{g%eR|IZ?fhxvSo&Dgs#ZjsFpub1rt8zT{J?Z%n zU1@Ubk4&n{3X+i{SF`Ig*Y}3@fS??76H9Hb@z4ebU4@sZI7Ob*Xf5UW(ApkZK9CY6 z4S~Qqs%qomFxnd*gt9{TRd8Ut%XGpm5@8vcITlb8JoS$Vxu_l2`@df5TgRgNj@mPE z1lgaObKKwbh*?~GUy=1w2JLv@`%qNX#;kvhulNd>$1{UFueJ|aXpY}S2;(Y7apjkN zS)L)Vye?KnN3`j;DY~DM#AAwMS){jJk(6#y7-D%o#Ied!q}g)IU(!gS@kTsfIiH0* zrbBMHkn1euKBN++9f!ilYLqFQ(hLfD2>9FijIO3$$jJ(qnE2fB&dlao$bt8rUAjz# zj4R~X7xI+$&E;= self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self._lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self._lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') + + def clear(self): + with self._lock: + # Copy pointers to all values, then wipe the mapping + # under Python 2, this copies the list of values twice :-| + values = list(self._container.values()) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self._lock: + return self._container.keys() diff --git a/requests/packages/urllib3/_collections.pyc b/requests/packages/urllib3/_collections.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f09788c436438760ec1584277d6bbe8bc1200fc GIT binary patch literal 3536 zcmcgvZEqVz5S~3dPV6>KXj3R4;3^?75{ZS1gj6a(O^Z~ZhF*$NqE_qk-6px@UfkPt zQls_@>GujD#Gm3H@H6-U@XVZjNh<_jNUiKQ zSfpU1%Vyf2VO+<@=ex2vNMd9C(099~3FB28ZW}*_1FLDWZ~SOxuz$FlM7w?l>)8YA zk4L^MWRt-l3m@6!M>81s`(|Q!YHE1H;t*i@;bAzz$oQ!Vty?Xpc&v^ANVQ;SCPf~< zxY=4qG*?Gq8D=XfO@rr|KyWzuao z4`I43#{UJrVuc{n!K+1?1)ggeIe#$}o& z!z(?Q0O*iMMQ+zdlgbO75^PIF=gD-rJ z)~gs+{(BvDUM(tN4F{n1|2MXf=t)CRQ1t9Ug@Q+WP$~ZI$dj)tAOxCg@P(lQu_}h4 zs5YtGohtWGf3R{MR8#k{xXJ5tq6#`*xIpDE^cZv`+HZ?2N@%d5!c@VRgVh(i+6mfpl+Xl=Jd=l#i;joWMAnstx6%mS zsmILDV)ijkw9Dv7wN%Hus1}=-)Vug!bC;7IJNlY?bmSR5(SiIM=iWF}3~*qGhnzquQIggmc)D5=b7T!B29*Z*(OKEZ3=9 z&Xge+I={djgj4jS*a+`XA0%30+U!*)o<2I?prAg5#A!@i@ER)uRYyd2z;Dz z2hDOaf-a4V>H<;#HGGx?T(=}eo=*bCPwp^4_Mf*EbCI87FM|dF+j$?Y&VYXR9EQ^? zI}bCXb@i;!SrLy@9#+W{7m?NhvnJs9NXYs{ZUVmWf+g-==k5*e-sJ8r?tJd})Z^?H z>HmIo1WaP)gIz(_I@|JE-qL(~zP*IjY&Y6x`tqK3Z0?EoN`N6bx!2@TjYqJ&qr_90 zjC3tZCz %s" % (url, redirect_location)) + return self.urlopen(method, redirect_location, body, headers, + retries - 1, redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, **response_kw) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + When Python is compiled with the :mod:`ssl` module, then + :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, + instead of :class:`httplib.HTTPSConnection`. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, and ``ssl_version`` + are only used if :mod:`ssl` is available and are fed into + :meth:`urllib3.util.ssl_wrap_socket` to upgrade the connection socket into an SSL socket. + """ + + scheme = 'https' + + def __init__(self, host, port=None, + strict=False, timeout=None, maxsize=1, + block=False, headers=None, + key_file=None, cert_file=None, + cert_reqs=None, ca_certs=None, ssl_version=None): + + HTTPConnectionPool.__init__(self, host, port, + strict, timeout, maxsize, + block, headers) + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.ssl_version = ssl_version + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + log.info("Starting new HTTPS connection (%d): %s" + % (self.num_connections, self.host)) + + if not ssl: # Platform-specific: Python compiled without +ssl + if not HTTPSConnection or HTTPSConnection is object: + raise SSLError("Can't connect to HTTPS URL because the SSL " + "module is not available.") + + return HTTPSConnection(host=self.host, + port=self.port, + strict=self.strict) + + connection = VerifiedHTTPSConnection(host=self.host, + port=self.port, + strict=self.strict) + connection.set_cert(key_file=self.key_file, cert_file=self.cert_file, + cert_reqs=self.cert_reqs, ca_certs=self.ca_certs) + + connection.ssl_version = self.ssl_version + + return connection + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example: :: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + if scheme == 'https': + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) diff --git a/requests/packages/urllib3/connectionpool.pyc b/requests/packages/urllib3/connectionpool.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d57af3ea6bdb7da859e98ddaffba89fb22ffa11e GIT binary patch literal 17747 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 literal 0 HcmV?d00001 diff --git a/requests/packages/urllib3/exceptions.py b/requests/packages/urllib3/exceptions.py new file mode 100644 index 0000000..c5eb962 --- /dev/null +++ b/requests/packages/urllib3/exceptions.py @@ -0,0 +1,87 @@ +# urllib3/exceptions.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + + +## Base Exceptions + +class HTTPError(Exception): + "Base exception used by this module." + pass + + +class PoolError(HTTPError): + "Base exception for errors caused within a pool." + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url) + + +class SSLError(HTTPError): + "Raised when SSL certificate fails in an HTTPS connection." + pass + + +class DecodeError(HTTPError): + "Raised when automatic decoding based on Content-Type fails." + pass + + +## Leaf Exceptions + +class MaxRetryError(PoolError): + "Raised when the maximum number of retries is exceeded." + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s" % url + if reason: + message += " (Caused by %s: %s)" % (type(reason), reason) + else: + message += " (Caused by redirect)" + + PoolError.__init__(self, pool, message) + self.url = url + + +class HostChangedError(PoolError): + "Raised when an existing pool gets a request for a foreign host." + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + PoolError.__init__(self, pool, message) + + self.url = url + self.retries = retries + + +class TimeoutError(PoolError): + "Raised when a socket timeout occurs." + pass + + +class EmptyPoolError(PoolError): + "Raised when a pool runs out of connections and no more are allowed." + pass + + +class ClosedPoolError(PoolError): + "Raised when a request enters a pool after the pool has been closed." + pass + + +class LocationParseError(ValueError, HTTPError): + "Raised when get_host or similar fails to parse the URL input." + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location diff --git a/requests/packages/urllib3/exceptions.pyc b/requests/packages/urllib3/exceptions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..657265f2e596b6dda0c822379379703e7fb139b6 GIT binary patch literal 4484 zcmc&%-EJF26rNo>e@@e;O$i7IF$fCIMdOP~Mf^iet0GDi)&@jw%w%^QZ@b<#JF{vc zg{$xiycKW2C6B-h@O`uP+D;n;QcNPvWajL6=A1L%`OcZzUmK0z|M>0OP>la-`2RVY z`4e3vgchRjiO3Vb3UMaHj|Z6eLVHeHtE9e&>J#ZwC9R2Qc_Lk@q;(Ok3hlcc)+*_e zh#C{=dL>;J(Y1+mqmr(O==wx@qmr(QXmcXHSxMJKbW3P#4V9tgR`p?BM7Kq!`3mf` zYv>+#yZaCGJj*Lzc#u9oGuP3<5wsn>FM>{!-^|-wpp2IKIMgE>XQ?cVj^yEqw1e2l zVHOpM-fh;f&aR^C^-?v|y`F8jN%Gtz7?HXk$%lq{3(FNSjuXCrNyGuT`mLc1I@xH|N==j&9jo_MGYaS(aR2 zy2QF!(@P{A;AVY#@}N#<&_2^bcg`98ESH)tH8NDrGtXlwb9Ib z=uSOx3Rl5po_OkWj6*2|WPGuG<_izk&}sTuyJwcs-!UJ`JEn9q4ddp{)Ung!G`8?8 zPqO@ObkYxargQvI8v~au%;(hbCQs$j!dvq~f`^R?IkUGhfSpfW$Z_CIg|#Kn_Da=> z(q1o2lrg{zciYQSZMh3>+d(oQk``sj7`3^MiVz@XBt#11mlxsCgAsH~QK6(>d# zzNsWzbYz&NsSX+VWssk9!D0>HfV!{KaC*SS@;U}z>M)D+f3*A~{BYKCRoHB(Y#hpn z+r{aTJOs~05)9YQQma#Yw|g=gyW|RN=M}z*HnpAJ_(mNE+U6(o))SErxR%bE<1*v} zBsOoB#qMLxtS9V1%b_}shs98)#qdz)GV9A6r^FgqFpm0lq@&%C*T6X7e;3t1VQ^X- zlNmV-?Db2XqWr!%MH=);ahRUDp5*pEzNZcMu_idNzIf`kAOY6JSxtD@hWv=%lLdL& zo_PyBtgjR!>r*R9!j)hL5~SI}D%ot8RE#85^5%|VB+tqb;c*UJ@3^?O4CGuZgNx^B z78f6IP)0aGSH?fN$I)s)S+L1&m0!`y?vg{FitV7e1Px~O8wme5{D!~f?Y)$enEIU7 zQ5IpivF(9Mk972J0qTk^0<>18+0U@kEI`3U`ZzY0G0MCr zkF+&X0ST@mkj%k~y^fDkIe-qkG3oh5xZZ^y#`nTmg^YhGt)&O|0}RZFo2w z*^_@LN-wgr{eqn?BJv_N5?&*7Pct@xB#mU6p-RuSRBTC-JqMG!YU_VZegQeqbH^^_(9V22V1SU#PM6 zRcx!mqvtR-)<05G4Rn~ed`WRGkp!H*^$#)->CPBtRVJyuAV9@08ec}1AM;2UN9j6sbtB}r1)BUF(kOS)64my3I_xa8!@*JNyT z2}YM%U&F5#Pk`3r-1M)A{&=7J)MS!E_nPEC_gsBAd2N?2%jb+nc3P4|Ckd+BenGu?my literal 0 HcmV?d00001 diff --git a/requests/packages/urllib3/filepost.py b/requests/packages/urllib3/filepost.py new file mode 100644 index 0000000..8d900bd --- /dev/null +++ b/requests/packages/urllib3/filepost.py @@ -0,0 +1,98 @@ +# urllib3/filepost.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import codecs +import mimetypes + +from uuid import uuid4 +from io import BytesIO + +from .packages import six +from .packages.six import b + +writer = codecs.lookup('utf-8')[3] + + +def choose_boundary(): + """ + Our embarassingly-simple replacement for mimetools.choose_boundary. + """ + return uuid4().hex + + +def get_content_type(filename): + return mimetypes.guess_type(filename)[0] or 'application/octet-stream' + + +def iter_fields(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k, v) for k, v in fields) + + +def encode_multipart_formdata(fields, boundary=None): + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, value) or (key, value, MIME type) + field tuples. The key is treated as the field name, and the value as + the body of the form-data bytes. If the value is a tuple of two + elements, then the first element is treated as the filename of the + form-data section and a suitable MIME type is guessed based on the + filename. If the value is a tuple of three elements, then the third + element is treated as an explicit MIME type of the form-data section. + + Field names and filenames must be unicode. + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`mimetools.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for fieldname, value in iter_fields(fields): + body.write(b('--%s\r\n' % (boundary))) + + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = get_content_type(filename) + writer(body).write('Content-Disposition: form-data; name="%s"; ' + 'filename="%s"\r\n' % (fieldname, filename)) + body.write(b('Content-Type: %s\r\n\r\n' % + (content_type,))) + else: + data = value + writer(body).write('Content-Disposition: form-data; name="%s"\r\n' + % (fieldname)) + body.write(b'\r\n') + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b'\r\n') + + body.write(b('--%s--\r\n' % (boundary))) + + content_type = b('multipart/form-data; boundary=%s' % boundary) + + return body.getvalue(), content_type diff --git a/requests/packages/urllib3/filepost.pyc b/requests/packages/urllib3/filepost.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba072802daa02f3744c6ff2535210aca3f8c82b3 GIT binary patch literal 3662 zcmcgvUr!rH5T83^8yg%5sUY+r+C-vtQfyaER8{1UqK2g6AyjoxBcVia_O0RI{y4Ym z1SEJOU!i^JSL$QtV@41>c9T}(+_F$BY59Q6YmWoaktTWwp$<~m5kL0iKPLE?A_D;e26m}_<{ zXcv=d@YvKeNc2bYexB88yVK87i|~l@Pr-BUdxiV#nYe!k6SxoGtw(1*<)1MENL1_7 zL1~Q1I&gUgM8L*Ip#+;ru54JH2Ue@>wa(Qb(s5|ob&3A7(QugM)~Gl#R%HX#JX}?; zZz?-NDj5}|p$enE#dgj)F_4Yp$MAC<1C+j8q8C1$dUWd331a2bz^5O*S0#Q`UFL2& zO!*{?Cu)BQmxvB!eEo3%HyrhQdpgxe!~DSt2tm3+AIOm|=TUcthgl5&hZCPqoM=vA zE~y-$0vH>leQlY?5$iI>lJ$5~b3BQ0X2%=a{L#hfva*Zc~FTDrzyYAX>vxKR4LKXLl5Q2)qwSvUwNEuB|4qrR6CgB5{&l( znYV~{0bkEn=mcz3c)T>fk)37|3wTWq!FkK%3kWFFX@yR!lwK7MqzVVXos@Y$mVhvn zU=BU#GAHf#h7-Mjpe^;)ANa`)pw8rbU?=$4tIIm90SkpaGB*CHxKaM zN(p$J_Ono{K*|D2E&2$Tjon=r?cH59;&!C$zE;U7w$U)iZ3lfQX@!9e)YFZpkGU-+ zfgP8iHS7qIaamduC0uLPk;D`EPP#%nn-nU2j8YZEBYl(k&BKCTby~Qz-z?;bgmGPK zE42mta6&~!ahI?ox{cfgR;B(iPt;&TA&r^6EEM16P~l*YJAYek3`Cea2ql42 z%~;ttSs_Qq(x}ZU?@q`1bClxo!h7v=JxWCF>q687W1|H+u|7~{6xpDMi-ADTps-Ns zesH=M7>t>yo`@Q^!GCvSKiB%)&WjG%{U{F$S?_lwNEK=_`gLS4*u~&*1PU<6o{Tev z)8YwtFU8RTrsz)R9orz=09#M1Q5tcIzMEa=cb-XpAwX$nl^N=Ogph~h2m~sJ*epSG z-7QJIiQ<^$avR|;8oCTG99$cW(*D}+KVGwTUGJ0{*lMkqMqRFZW{nG=y9l(_BZC`K z#0kGPasRIPdH=?WxpB8}RLDl%d~)IV7J|B_STq*CxUle_a_-0JG1cQW+7Kiq;Z!UG|Jm} zYcBjKwepMW+oX$GedO*-DCKgAk~gc#M3?Ol_Ib?29)3Ng0m=)_86*1TT$j(eUWuZF za*JE(g*#ajwCm;{^zyq5saopiP66%?Cp%ZhTUaz-v*If?Z`Pajm(eZfyajK;2j$Iq zmoQ%TE0|4t4Xn)h3*MsN@GtvI{=DB5&>2Zi{=Vt*R6OK=ChmUEk&ZGKF$UoLrtVN? z5Y9Pm{8N#*No?XQI~)zWi`d`-%u$mlcNciZm%s^RGW(#ov90%#EF8u90spy@+-Hd9 Py?J@Alxo%5RBiSzaNliR literal 0 HcmV?d00001 diff --git a/requests/packages/urllib3/packages/__init__.py b/requests/packages/urllib3/packages/__init__.py new file mode 100644 index 0000000..37e8351 --- /dev/null +++ b/requests/packages/urllib3/packages/__init__.py @@ -0,0 +1,4 @@ +from __future__ import absolute_import + +from . import ssl_match_hostname + diff --git a/requests/packages/urllib3/packages/__init__.pyc b/requests/packages/urllib3/packages/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..540ede62e1c5452110af1cf92648c7e31e9fd303 GIT binary patch literal 294 zcmYL_!Ab)$5QZna6{JuUpP`4n)Es&(Qs`Z@EeO2~=_b0tWV7x}4t)^c$~W*ad;upa zHB7$z|4e2AslR5^kI(nV7XDTx=Xwo5a}icTK>&yf4hod5z}65dh&3E)@e|lJ7jn_d zhDHhaN??wZLS~0P4rydx3cuAGQA7cw;kLsr5%(s#`({#Frvk+1%z1Q(TXDbz+n@fT znltD@r0!C5+M2#U>HTKE2%g>IX}LKYJ-WB-h)EBoeKjwRbRI+S$K`(l(f6JaZ-*0K S%FtCzHV1cC9;Naf*VQ+K(n4PV literal 0 HcmV?d00001 diff --git a/requests/packages/urllib3/packages/ordered_dict.py b/requests/packages/urllib3/packages/ordered_dict.py new file mode 100644 index 0000000..7f8ee15 --- /dev/null +++ b/requests/packages/urllib3/packages/ordered_dict.py @@ -0,0 +1,260 @@ +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. +# Copyright 2009 Raymond Hettinger, released under the MIT License. +# http://code.activestate.com/recipes/576693/ + +try: + from thread import get_ident as _get_ident +except ImportError: + from dummy_thread import get_ident as _get_ident + +try: + from _abcoll import KeysView, ValuesView, ItemsView +except ImportError: + pass + + +class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running={}): + 'od.__repr__() <==> repr(od)' + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) diff --git a/requests/packages/urllib3/packages/ordered_dict.pyc b/requests/packages/urllib3/packages/ordered_dict.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db5b124bc5ea297e887063486be56ed2c889c7a3 GIT binary patch literal 10462 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 VNS5kT1R9+6&J~KDkKd)@KLNWBS#1CS literal 0 HcmV?d00001 diff --git a/requests/packages/urllib3/packages/six.py b/requests/packages/urllib3/packages/six.py new file mode 100644 index 0000000..27d8011 --- /dev/null +++ b/requests/packages/urllib3/packages/six.py @@ -0,0 +1,385 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +#Copyright (c) 2010-2011 Benjamin Peterson + +#Permission is hereby granted, free of charge, to any person obtaining a copy of +#this software and associated documentation files (the "Software"), to deal in +#the Software without restriction, including without limitation the rights to +#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +#the Software, and to permit persons to whom the Software is furnished to do so, +#subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in all +#copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +#FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +#COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +#IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +#CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.2.0" # Revision 41c74fef2ded + + +# True if we are running on Python 3. +PY3 = sys.version_info[0] == 3 + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) + # This is a bit ugly, but it avoids running this again. + delattr(tp, self.name) + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + + +class _MovedItems(types.ModuleType): + """Lazy loading of moved objects""" + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("reload_module", "__builtin__", "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("winreg", "_winreg"), +] +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) +del attr + +moves = sys.modules[__name__ + ".moves"] = _MovedItems("moves") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_code = "__code__" + _func_defaults = "__defaults__" + + _iterkeys = "keys" + _itervalues = "values" + _iteritems = "items" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_code = "func_code" + _func_defaults = "func_defaults" + + _iterkeys = "iterkeys" + _itervalues = "itervalues" + _iteritems = "iteritems" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +if PY3: + def get_unbound_function(unbound): + return unbound + + Iterator = object + + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) +else: + def get_unbound_function(unbound): + return unbound.im_func + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) + + +def iterkeys(d): + """Return an iterator over the keys of a dictionary.""" + return iter(getattr(d, _iterkeys)()) + +def itervalues(d): + """Return an iterator over the values of a dictionary.""" + return iter(getattr(d, _itervalues)()) + +def iteritems(d): + """Return an iterator over the (key, value) pairs of a dictionary.""" + return iter(getattr(d, _iteritems)()) + + +if PY3: + def b(s): + return s.encode("latin-1") + def u(s): + return s + if sys.version_info[1] <= 1: + def int2byte(i): + return bytes((i,)) + else: + # This is about 2x faster than the implementation above on 3.2+ + int2byte = operator.methodcaller("to_bytes", 1, "big") + import io + StringIO = io.StringIO + BytesIO = io.BytesIO +else: + def b(s): + return s + def u(s): + return unicode(s, "unicode_escape") + int2byte = chr + import StringIO + StringIO = BytesIO = StringIO.StringIO +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +if PY3: + import builtins + exec_ = getattr(builtins, "exec") + + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + + + print_ = getattr(builtins, "print") + del builtins + +else: + def exec_(code, globs=None, locs=None): + """Execute code in a namespace.""" + if globs is None: + frame = sys._getframe(1) + globs = frame.f_globals + if locs is None: + locs = frame.f_locals + del frame + elif locs is None: + locs = globs + exec("""exec code in globs, locs""") + + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + + def print_(*args, **kwargs): + """The new-style print function.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + def write(data): + if not isinstance(data, basestring): + data = str(data) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) + +_add_doc(reraise, """Reraise an exception.""") + + +def with_metaclass(meta, base=object): + """Create a base class with a metaclass.""" + return meta("NewBase", (base,), {}) diff --git a/requests/packages/urllib3/packages/six.pyc b/requests/packages/urllib3/packages/six.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7daf9424ac4471ce2ba1efbe4f3d98e2fc7a9441 GIT binary patch literal 14266 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 D2j#qQ literal 0 HcmV?d00001 diff --git a/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py b/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 0000000..9560b04 --- /dev/null +++ b/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py @@ -0,0 +1,61 @@ +"""The match_hostname() function from Python 3.2, essential when using SSL.""" + +import re + +__version__ = '3.2.2' + +class CertificateError(ValueError): + pass + +def _dnsname_to_pat(dn): + pats = [] + for frag in dn.split(r'.'): + if frag == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + else: + # Otherwise, '*' matches any dotless fragment. + frag = re.escape(frag) + pats.append(frag.replace(r'\*', '[^.]*')) + return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules + are mostly followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_to_pat(value).match(hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_to_pat(value).match(hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc b/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..736d5de79900a290746f5a8b30fcdbe6af161dff GIT binary patch literal 2411 zcmcguTW{P%6h5{S=hE~dN)uIpGy(;-A>9>iA1ZMXAt_LV(z07MB5ko8dp7Hh*LG&c zZC6TOC=Wa%@!UVe1MmC<9{B+zg9XU=`T+2F6Ui@*Kx>vsvAJORF+ z6}bL-qvf)v$n4> z+#6^$id`~@2BmdHJkqTzs$Un0%gRFaO*v9`$8Lc6_4c)OrLEP4%i>%;8R$aQHY@g3 zulH>``y0=;orOvWwy(Jhm~Cp~vVNAtPTw-7G%o`3!2ANQWj{3h^QhZvVNNX{gX85W zVsE0zEebIz(>e#)NMVU&W?5%vP>ysbjf-O3xwm=mYMwcLb?5r#3!-E6VXdvRohnWa z;(cv9waN2r@A`DX+B`a)iB1${MdqTYU5&eJaSpF#2SYF65V$TJ@g`pTGlqSlV~?Ib zpd+H86zQ2qTaUh>W1o&tBA*U?GB@eSqoLFdZ0~THoKM4mB|x*Nut5${K>TLunXp)N zhh-v9mJin|Oa(;MY}KcOL#kX@5Wsg7e-x zUc$k1xco}l_mN~&+g>6!Dfo{b6-_Uol*oV_)$}Y^<~X3Ix9KQAQ*6*f&@*&AOGl`2 zAgytO^KyiGqXW zJ%5#{-(O+sIUPQyox@*f2T`FVU=;45`wnKvv^+Ednh&m~3*3GX!y5S;bbNPis?PX>Yu!@BpfMWpbchdtbXsYr~scSFSV|s4Y}#wKjpmwYE~- zFE`b-n;+d&2JmA=No;_bK+Aj#OL<;C(doL{tDU-iSH)>+7$mJ?siK4zNun#)c=fXC zMbY(dh*TMzjx!5+#@{&0YopuhPN8fKMb@s1ixY$v9Zisytqp+3ZCSJ{NR}Q|ZmdcJ zmf}cHz}RtP+j?)P6StAOZQ!iqGr6_h+m^$8!jn^g!#pYrmdO}T?E4rd2~w*@rKPsT z2d>GW(it*nRM}UnR-j~E*|-09$EwM|C;KS|xCxLkWo0tl8ER^pV>s=w>SsDnt$L!7 z=YCli=@d9xe0s(C`*B`3caH>!qIdaX5?~Xs?=r9nFV}^DeD};`WfWI}N`N-g;sY-f z=TR=GNfLxOK@TgcY+T6qK##@JWA>uq)O%AmUmL!0xldnh+#I%zf#yT+JRt53@1nQl zUGiqUH@z^p>|G2R>Md|We^tg6zsUlpB8t*7iK4Egg)>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, + dispose_func=lambda p: p.close()) + + def _new_pool(self, scheme, host, port): + """ + Create a new :class:`ConnectionPool` based on host, port and scheme. + + This method is used to actually create the connection pools handed out + by :meth:`connection_from_url` and companion methods. It is intended + to be overridden for customization. + """ + pool_cls = pool_classes_by_scheme[scheme] + return pool_cls(host, port, **self.connection_pool_kw) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme='http'): + """ + Get a :class:`ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. + """ + scheme = scheme or 'http' + port = port or port_by_scheme.get(scheme, 80) + + pool_key = (scheme, host, port) + + # If the scheme, host, or port doesn't match existing open connections, + # open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + pool = self._new_pool(scheme, host, port) + self.pools[pool_key] = pool + return pool + + def connection_from_url(self, url): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url` but + doesn't pass any additional parameters to the + :class:`urllib3.connectionpool.ConnectionPool` constructor. + + Additional parameters are taken from the :class:`.PoolManager` + constructor. + """ + u = parse_url(url) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw['assert_same_host'] = False + kw['redirect'] = False + if 'headers' not in kw: + kw['headers'] = self.headers + + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + if response.status == 303: + method = 'GET' + + log.info("Redirecting %s -> %s" % (url, redirect_location)) + kw['retries'] = kw.get('retries', 3) - 1 # Persist retries countdown + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(RequestMethods): + """ + Given a ConnectionPool to a proxy, the ProxyManager's ``urlopen`` method + will make requests to any url through the defined proxy. The ProxyManager + class will automatically set the 'Host' header if it is not provided. + """ + + def __init__(self, proxy_pool): + self.proxy_pool = proxy_pool + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + host = parse_url(url).host + if host: + headers_['Host'] = host + + if headers: + headers_.update(headers) + + return headers_ + + def urlopen(self, method, url, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + kw['assert_same_host'] = False + kw['headers'] = self._set_proxy_headers(url, headers=kw.get('headers')) + return self.proxy_pool.urlopen(method, url, **kw) + + +def proxy_from_url(url, **pool_kw): + proxy_pool = connection_from_url(url, **pool_kw) + return ProxyManager(proxy_pool) diff --git a/requests/packages/urllib3/poolmanager.pyc b/requests/packages/urllib3/poolmanager.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c4cadfbcd7e29704c3751fab71e18a706694bf6 GIT binary patch literal 7244 zcmcIpU2h~u6|J7J$2(p-cD^>7@Kp%`PgY)AN?<`|vr1wu*#L1iZ6m}8)NXgzczWH_ zJ#^K?YqWmam3Trz0$z~#2k@4kkvAk>_y;^8@dMzTTRlDYZdQPZz3y^#b$5N-d+xcX zYTN%@Ui|EDzyCN<^-mjr-@#@7f+EFlpmL@9sI*ktR(YUCE!A(SfcJAMZ>!Oq>d&ds zyz0;U)_G~|sD4L{7F2)1w{}#1NsYRy-}UzkDqmEi%c_4F_m@=KRq3KSY^(l~%38|I zsr0hCVdho3q;B+=l~L;6Gs>)}hk@#^DtuwOY7nS&Sv^wfp;ABXKg&+))@Pd5=Ty4F zoBs1$%WiKK>&pIxpPei~wa3D}h$1wJDO`T?V{6jwvT$)$n5x&}!xW`^ zSp^MHnb;XUsEi#pqirR5Z0*)QP@HE6Z*9zmpm8_08?Y0g`&gcJaRE=&bGv;%9*uLe zrMI@ccj$*(w{Gc?$FhD~^TQg*y~b&8zxhTp1-@S4#rl(t8autU_iyj5t?MGNT&_7+yd_E@Cu(r{lXR&GVOc^m*omouo`snFX6PfF8LT z!Bmygagl1Dg6a@uMD7hUt4ET7G-^{uh!ZyfM}czvXkex%sdI=PIm%>4kOwDvi@j~_ zpYhZ*8Scvz5T@g}03X%E+711IFWd;t$zQ&G!v=Jb-_|RK(@hm z%mwE?wj(YJDYhhh6QtTo@E+1b7iRbH%jo?ME=%*Ng-}SCrY9zNiNz9*AP)hR8v$-bcFQy;D%>XsU`6=N8z+7jxXqjo)=R}bb@^%2WmK0`-B;G}hYAdmew zi2j>=OGw=Q6~i~ieBZzq|2ftfq_cQm|NMaeV4(N+iSm8qY+I~3FEZA3=DZ^ja?mgk z9w`JtIU-!}g^v|{GqI3H&CK?nCJ)YQ-u?Yqq>8<>yI7xabx6x2sVQ}6oS-565}(l# z0)+4?YcI2S3B@cpkIYFOvSof@XmKxK%*VNmM*bM>mf%$jOTpFF%G`57Czxx$7%T?~ zfyEUyVA{Zq=XqiRpz+xqKoRW?FaQ{U6f49{t46`Kv&6rfjj}whs3o_U)}JcP9-l6f z?>?io@mg9M@%$J94=6d&@#jiJ3}fJ&tL1a$z6}35Fpq&+y$PF9j%0 zI7bnE|3HNh0WWyk@DQ1wLIf2L5mW>srycSpSOdGYn{^Eol1kgrf~xifW*vEDUfnFv zc}Lw_pxOY>+`GgF&={v^X{+*A>cN7#*JW}!#iL8g{*EoXY+dBe@2I7!KXK=G8YuMT zE~|S>+?Zp=cze)NS1|DaecoG^?cyQ{61)1VoMIQ;h6VY-rz7w7xSzE@KL_%7WOQt& zD&i?vdvbTafj7&sDP|CneU?`XP%)*o*BQ3hb=7GwFAuXsII=7tbS$)o6|$?<>-9;M zHFzVPQL-SPdOpN(B(>&+J+P$g*1(nWY_`|ZBS;o1nfSn#`NWxZZ70bP9mN!7Iv$U! za$IHDf;HVu(f^e7Z$GyAO3)1kNU*|MCS~png%^qikz;Dt1@FVBHW*_@JJ$jTIflp|9+fXBLhhnwdVjR zrE1&b@FSB`8svm%I<+V-6H$F$yt&xHt{fMhlthpfgEFL~?lH1_fO8^V-iEKT@pTlA z{CspAzQ#J!4+*oj0(MP>HI91giE%HEAJ{X3U)issP~eBxTZ_SBuoSGeuC^qxv{r&{ z>!sk8V5dhr$!w#jpbsNQ1rtT1GM(hS4Qjq-~vz zCK7jq4Aq?4NJmJWKri~K%E=)kn%ZfAlSCX2afl7l|11_()gQSf*oyEU0=?_o=d-zk08&KPgSi*M4?~JQW*&oCE zNO#O-NJqDsxgeo@(hS(zhJYsK?Qc*tbh>MtZ4TB7W4LX_R+Xjzd2MMsHc2+{PVlgJ zH%ZLc@0sa~rlI-o1@ zEgeArim+iU)1B~K;8lQZm#B8ddE7~1Pm6Ob(Kn(K@BmvWc@M2}5JJ=0cTnus3V|A+ zxBJHV@Se(m^(GBJo_sgLucH&mKHjivyyf;=Qinu>r$Vm6??5(K6Wed1c43y5VgHN~ zEMcIK0$u~%lQYA&SbU2G4+lM&-(XE9&Kb>SCABX)gfC%;-{O)3t


)om}WCXfjd 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 literal 0 HcmV?d00001 diff --git a/requests/packages/urllib3/util.py b/requests/packages/urllib3/util.py new file mode 100644 index 0000000..b827bc4 --- /dev/null +++ b/requests/packages/urllib3/util.py @@ -0,0 +1,338 @@ +# urllib3/util.py +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) +# +# This module is part of urllib3 and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + + +from base64 import b64encode +from collections import namedtuple +from socket import error as SocketError + +try: + from select import poll, POLLIN +except ImportError: # `poll` doesn't exist on OSX and other platforms + poll = False + try: + from select import select + except ImportError: # `select` doesn't exist on AppEngine. + select = False + +try: # Test for SSL features + SSLContext = None + HAS_SNI = False + + import ssl + from ssl import wrap_socket, CERT_NONE, SSLError, PROTOCOL_SSLv23 + from ssl import SSLContext # Modern SSL? + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +from .packages import six +from .exceptions import LocationParseError + + +class Url(namedtuple('Url', ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'])): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. + """ + slots = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, query=None, fragment=None): + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example: :: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx+1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example: :: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this imeplementations does silly things to be optimal + # on CPython. + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + auth, url = url.split('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url[1:].split(']', 1) + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if not port.isdigit(): + raise LocationParseError("Failed to parse: %s" % url) + + port = int(port) + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + + +def get_host(url): + """ + Deprecated. Use :func:`.parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + Example: :: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = 'gzip,deflate' + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(six.b(basic_auth)).decode('utf-8') + + return headers + + +def is_connection_dropped(conn): + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`httplib.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, 'sock', False) + if not sock: # Platform-specific: AppEngine + return False + + if not poll: # Platform-specific + if not select: # Platform-specific: AppEngine + return False + + try: + return select([sock], [], [], 0.0)[0] + except SocketError: + return True + + # This version is better on platforms that support it. + p = poll() + p.register(sock, POLLIN) + for (fno, ev) in p.poll(0.0): + if fno == sock.fileno(): + # Either data is buffered (bad), or the connection is dropped. + return True + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbrevation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + +if SSLContext is not None: # Python 3.2+ + def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None): + """ + All arguments except `server_hostname` have the same meaning as for + :func:`ssl.wrap_socket` + + :param server_hostname: + Hostname of the expected certificate + """ + context = SSLContext(ssl_version) + context.verify_mode = cert_reqs + if ca_certs: + try: + context.load_verify_locations(ca_certs) + # Py32 raises IOError + # Py33 raises FileNotFoundError + except Exception as e: # Reraise as SSLError + raise SSLError(e) + if certfile: + # FIXME: This block needs a test. + context.load_cert_chain(certfile, keyfile) + if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI + return context.wrap_socket(sock, server_hostname=server_hostname) + return context.wrap_socket(sock) + +else: # Python 3.1 and earlier + def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None): + return wrap_socket(sock, keyfile=keyfile, certfile=certfile, + ca_certs=ca_certs, cert_reqs=cert_reqs, + ssl_version=ssl_version) diff --git a/requests/packages/urllib3/util.pyc b/requests/packages/urllib3/util.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c775d7e4bac167b2f9214f9cae40b28cbf2b663e GIT binary patch literal 9485 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 T{GC~Mc6oNu%H-lTO6LCpAz-pQ literal 0 HcmV?d00001 diff --git a/requests/sessions.py b/requests/sessions.py new file mode 100644 index 0000000..de0d9d6 --- /dev/null +++ b/requests/sessions.py @@ -0,0 +1,515 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). + +""" +import os +from datetime import datetime + +from .compat import cookielib +from .cookies import cookiejar_from_dict +from .models import Request, PreparedRequest +from .hooks import default_hooks, dispatch_hook +from .utils import from_key_val_list, default_headers +from .exceptions import TooManyRedirects, InvalidSchema + +from .compat import urlparse, urljoin +from .adapters import HTTPAdapter + +from .utils import requote_uri, get_environ_proxies, get_netrc_auth + +from .status_codes import codes +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_moved, # 307 +) +DEFAULT_REDIRECT_LIMIT = 30 + + +def merge_kwargs(local_kwarg, default_kwarg): + """Merges kwarg dictionaries. + + If a local key in the dictionary is set to None, it will be removed. + """ + + if default_kwarg is None: + return local_kwarg + + if isinstance(local_kwarg, str): + return local_kwarg + + if local_kwarg is None: + return default_kwarg + + # Bypass if not a dictionary (e.g. timeout) + if not hasattr(default_kwarg, 'items'): + return local_kwarg + + default_kwarg = from_key_val_list(default_kwarg) + local_kwarg = from_key_val_list(local_kwarg) + + # Update new values in a case-insensitive way + def get_original_key(original_keys, new_key): + """ + Finds the key from original_keys that case-insensitive matches new_key. + """ + for original_key in original_keys: + if key.lower() == original_key.lower(): + return original_key + return new_key + + kwargs = default_kwarg.copy() + original_keys = kwargs.keys() + for key, value in local_kwarg.items(): + kwargs[get_original_key(original_keys, key)] = value + + # Remove keys that are set to None. + for (k, v) in local_kwarg.items(): + if v is None: + del kwargs[k] + + return kwargs + + +class SessionRedirectMixin(object): + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None): + """Receives a Response. Returns a generator of Responses.""" + + i = 0 + prepared_request = PreparedRequest() + prepared_request.body = req.body + prepared_request.headers = req.headers.copy() + prepared_request.hooks = req.hooks + prepared_request.method = req.method + prepared_request.url = req.url + + cookiejar = cookiejar_from_dict({}) + cookiejar.update(self.cookies) + cookiejar.update(resp.cookies) + + # ((resp.status_code is codes.see_other)) + while (('location' in resp.headers and resp.status_code in REDIRECT_STATI)): + + resp.content # Consume socket so it can be released + + if i >= self.max_redirects: + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects) + + # Release the connection back into the pool. + resp.close() + + url = resp.headers['location'] + method = prepared_request.method + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = '%s:%s' % (parsed_rurl.scheme, url) + + # Facilitate non-RFC2616-compliant 'location' headers + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + if not urlparse(url).netloc: + # Compliant with RFC3986, we percent encode the url. + url = urljoin(resp.url, requote_uri(url)) + + prepared_request.url = url + + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4 + if (resp.status_code == codes.see_other and + prepared_request.method != 'HEAD'): + method = 'GET' + + # Do what the browsers do, despite standards... + if (resp.status_code in (codes.moved, codes.found) and + prepared_request.method == 'POST'): + method = 'GET' + + prepared_request.method = method + + # https://github.com/kennethreitz/requests/issues/1084 + if resp.status_code not in (codes.temporary, codes.resume): + if 'Content-Length' in prepared_request.headers: + del prepared_request.headers['Content-Length'] + + prepared_request.body = None + + headers = prepared_request.headers + try: + del headers['Cookie'] + except KeyError: + pass + + prepared_request.prepare_cookies(cookiejar) + + resp = self.send( + prepared_request, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + ) + + cookiejar.update(resp.cookies) + + i += 1 + yield resp + + resp.cookies.update(cookiejar) + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistience, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('http://httpbin.org/get') + 200 + """ + + __attrs__ = [ + 'headers', 'cookies', 'auth', 'timeout', 'proxies', 'hooks', + 'params', 'verify', 'cert', 'prefetch', 'adapters', 'stream', + 'trust_env', 'max_redirects'] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request ` sent from this + #: :class:`Session `. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request `. + self.auth = None + + #: Dictionary mapping protocol to the URL of the proxy (e.g. + #: {'http': 'foo.bar:3128'}) to be used on each + #: :class:`Request `. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request `. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + self.verify = True + + #: SSL certificate default. + self.cert = None + + #: Maximum number of redirects to follow. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Should we trust the environment? + self.trust_env = True + + # Set up a CookieJar to be used by default + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = {} + self.mount('http://', HTTPAdapter()) + self.mount('https://', HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def request(self, method, url, + params=None, + data=None, + headers=None, + cookies=None, + files=None, + auth=None, + timeout=None, + allow_redirects=True, + proxies=None, + hooks=None, + stream=None, + verify=None, + cert=None): + """Constructs a :class:`Request `, prepares it and sends it. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary or bytes to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of 'filename': file-like-objects + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) Float describing the timeout of the + request. + :param allow_redirects: (optional) Boolean. Set to True by default. + :param proxies: (optional) Dictionary mapping protocol to the URL of + the proxy. + :param return_response: (optional) If False, an un-sent Request object + will returned. + :param config: (optional) A configuration dictionary. See + ``request.defaults`` for allowed keys and their default values. + :param prefetch: (optional) whether to immediately download the response + content. Defaults to ``True``. + :param verify: (optional) if ``True``, the SSL cert will be verified. + A CA_BUNDLE path can also be provided. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + """ + + cookies = cookies or {} + proxies = proxies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = self.cookies.copy() + merged_cookies.update(cookies) + cookies = merged_cookies + + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + env_proxies = get_environ_proxies(url) or {} + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Set environment's basic authentication. + if not auth: + auth = get_netrc_auth(url) + + # Look for configuration. + if not verify and verify is not False: + verify = os.environ.get('REQUESTS_CA_BUNDLE') + + # Curl compatibility. + if not verify and verify is not False: + verify = os.environ.get('CURL_CA_BUNDLE') + + # Merge all the kwargs. + params = merge_kwargs(params, self.params) + headers = merge_kwargs(headers, self.headers) + auth = merge_kwargs(auth, self.auth) + proxies = merge_kwargs(proxies, self.proxies) + hooks = merge_kwargs(hooks, self.hooks) + stream = merge_kwargs(stream, self.stream) + verify = merge_kwargs(verify, self.verify) + cert = merge_kwargs(cert, self.cert) + + # Create the Request. + req = Request() + req.method = method.upper() + req.url = url + req.headers = headers + req.files = files + req.data = data + req.params = params + req.auth = auth + req.cookies = cookies + req.hooks = hooks + + # Prepare the Request. + prep = req.prepare() + + # Send the request. + send_kwargs = { + 'stream': stream, + 'timeout': timeout, + 'verify': verify, + 'cert': cert, + 'proxies': proxies, + 'allow_redirects': allow_redirects, + } + resp = self.send(prep, **send_kwargs) + + # Persist cookies. + self.cookies.update(resp.cookies) + + return resp + + def get(self, url, **kwargs): + """Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + """Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + """Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, **kwargs): + """Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return self.request('POST', url, data=data, **kwargs) + + def put(self, url, data=None, **kwargs): + """Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + """Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + """Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest.""" + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + kwargs.setdefault('proxies', self.proxies) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if getattr(request, 'prepare', None): + raise ValueError('You can only send PreparedRequests.') + + # Set up variables needed for resolve_redirects and dispatching of + # hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + timeout = kwargs.get('timeout') + verify = kwargs.get('verify') + cert = kwargs.get('cert') + proxies = kwargs.get('proxies') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = datetime.utcnow() + # Send the request + r = adapter.send(request, **kwargs) + # Total elapsed time of the request (approximately) + r.elapsed = datetime.utcnow() - start + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, stream=stream, + timeout=timeout, verify=verify, cert=cert, + proxies=proxies) + + # Resolve redirects if allowed. + history = [resp for resp in gen] if allow_redirects else [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = tuple(history) + + return r + + def get_adapter(self, url): + """Returns the appropriate connnection adapter for the given URL.""" + for (prefix, adapter) in self.adapters.items(): + + if url.startswith(prefix): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for '%s'" % url) + + def close(self): + """Closes all adapters and as such the session""" + for _, v in self.adapters.items(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix.""" + self.adapters[prefix] = adapter + + def __getstate__(self): + return dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """Returns a :class:`Session` for context-management.""" + + return Session() diff --git a/requests/sessions.pyc b/requests/sessions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80da6ddf935a67bec81ddef62a44664c8d8192db GIT binary patch literal 14805 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 literal 0 HcmV?d00001 diff --git a/requests/status_codes.py b/requests/status_codes.py new file mode 100644 index 0000000..08edab4 --- /dev/null +++ b/requests/status_codes.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- + +from .structures import LookupDict + +_codes = { + + # Informational. + 100: ('continue',), + 101: ('switching_protocols',), + 102: ('processing',), + 103: ('checkpoint',), + 122: ('uri_too_long', 'request_uri_too_long'), + 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), + 201: ('created',), + 202: ('accepted',), + 203: ('non_authoritative_info', 'non_authoritative_information'), + 204: ('no_content',), + 205: ('reset_content', 'reset'), + 206: ('partial_content', 'partial'), + 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), + 208: ('im_used',), + + # Redirection. + 300: ('multiple_choices',), + 301: ('moved_permanently', 'moved', '\\o-'), + 302: ('found',), + 303: ('see_other', 'other'), + 304: ('not_modified',), + 305: ('use_proxy',), + 306: ('switch_proxy',), + 307: ('temporary_redirect', 'temporary_moved', 'temporary'), + 308: ('resume_incomplete', 'resume'), + + # Client Error. + 400: ('bad_request', 'bad'), + 401: ('unauthorized',), + 402: ('payment_required', 'payment'), + 403: ('forbidden',), + 404: ('not_found', '-o-'), + 405: ('method_not_allowed', 'not_allowed'), + 406: ('not_acceptable',), + 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), + 408: ('request_timeout', 'timeout'), + 409: ('conflict',), + 410: ('gone',), + 411: ('length_required',), + 412: ('precondition_failed', 'precondition'), + 413: ('request_entity_too_large',), + 414: ('request_uri_too_large',), + 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), + 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), + 417: ('expectation_failed',), + 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 422: ('unprocessable_entity', 'unprocessable'), + 423: ('locked',), + 424: ('failed_dependency', 'dependency'), + 425: ('unordered_collection', 'unordered'), + 426: ('upgrade_required', 'upgrade'), + 428: ('precondition_required', 'precondition'), + 429: ('too_many_requests', 'too_many'), + 431: ('header_fields_too_large', 'fields_too_large'), + 444: ('no_response', 'none'), + 449: ('retry_with', 'retry'), + 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 499: ('client_closed_request',), + + # Server Error. + 500: ('internal_server_error', 'server_error', '/o\\', '✗'), + 501: ('not_implemented',), + 502: ('bad_gateway',), + 503: ('service_unavailable', 'unavailable'), + 504: ('gateway_timeout',), + 505: ('http_version_not_supported', 'http_version'), + 506: ('variant_also_negotiates',), + 507: ('insufficient_storage',), + 509: ('bandwidth_limit_exceeded', 'bandwidth'), + 510: ('not_extended',), +} + +codes = LookupDict(name='status_codes') + +for (code, titles) in list(_codes.items()): + for title in titles: + setattr(codes, title, code) + if not title.startswith('\\'): + setattr(codes, title.upper(), code) diff --git a/requests/status_codes.pyc b/requests/status_codes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a536873f27abb91367528a99ffd55803d779f529 GIT binary patch literal 4424 zcmZ`+39uYh6}|I6Nk~FWR78}bK(VYZ=I4j7iC~B%fJ+1!5<`6w+x~Ok{JBX__oVwx z@&~J|vSL|fl_d(sxI{!P6)7yreZvLZSi<7I;EMac1Q4~fJm>Xv{|QO5yz}0@_uanl zzPr2`Ke%kkfd}_q(URexV}a}Nzt}t`qWIU4M5No0>4r3Ho#>}T$K@RTwCDoBXG9kP zJ}bHy@Hx@r0G}5<9&nrJ34kw%o(TA&=t+PtiJlDjvgoOR+eJ?U+#xyv_=@Q1fUk}t;1{B=20SGC8o)0_Ukmt^=<5K#7JWV7H==I<{8sdhfZvH; z3;4b0b$~yJ?gji&bRXbPqWb}V7QF%R7ttF5e-(W{;BTTI0Q_C_Ccr;LZw4F`y#?^F z=&gW9L_aF$Opl3ch<;4;rrh<<{*ilt*Ud;3zV8Vc=PI);B+c0ShFqMwv2Cmuz3 zSp&la2fqZv#w^>>?`^P__YA;RmU>J3&Jcj&pNyf{ZNAm9bT;bcna^5TQkWx?yFqHX zq5#+06|L2AtsTA0plFt~<1qAdi+q+vNtVv~<3Y&X&b}*rG|I4RD30KlY==K4Ks@jZ zF^Q8T0*wZiQ_!o$Y?f&;4$jtWD&Rx=ueUp~_KPsIau<82b{7d@ORMF2q})x)2^i8W zjpDxVWV!j++b$Pb+RpsRM`h(*h-InWLk;vonnm=R!-)@&whTk=3g;`bUr5-7XFFkWV@V3J%^*FI94(UCkWJ`uP1Gi!aP_z>!)g~xLk~7;arsY zj>`ix%xsEG9w^Ox)Xmh|218a?TVNKWYi?j?RDxyL4XJBLeG;~N*X?C_oDZTL`*Vk= zr7!2n!Ng!jO|vt(o2SB^^t-&?R@Q}oybHlqQtd2C(Va7~LVE~L&$zQ{;O-&OuA>wk)6Vi4Q+26bUy5Sjt(-7Q@%~lB8c_W7jJU0juAuW%z!S+!d z-CQNDx30_jKAdtmx3^P>35HB)CnzWO4pNxLvsvowot2Wrp#*elE9_llu+a2yof!g& zxfQizOK@U_%qZRVQ~E?uD_eLlKPZb!oXW~1aYDt14;3`At_tPQ6K1^BWOusjq z$Li`p2+=eo+Rc>WC5~QxEo!$^rm?4>M6n!%ge^h{R#f{4<(>*P9fwcl5voq2#eA>? zLmp4GTe+*uHRvsRS&CB5Kt`uI=I(f4kCGVP0r&`-M1%^s3&|P6o5CY& z`)8$kxI3zp!dwzY!03XcwfLhv7QSt@4YRCk-A=p@!PAGx`fbBgN1qFgiWzm%_fl$%34 zhm8G?)NuJRDspgc=*Ea}#mfg=*?L)cP8GxI7v4{S(&SsFoUxIVGwPZkqsiXcWWr6b zI~V1{r%5eMTGnKcHRyA8H>GBlfKoGiLX%fqGMH{9gXvtc_D;7;e}A@K9w5j z(&jVj*)ur{UpWo4;t1_N=&aj)d8lVomcA{!dr6$Yy7?RoEvNXlop&zemL**>e+dmg+0&5ta*OT zxS*cBfV1$?wG_FK!@8RGLM|`ju%5J_enZW@n2bv}TuNH_(2KZyF_#n$ZY!%-$$lx> z8_5pRFXQsEdU-jQFRzzZa2bpa!c8u(tht-G+*~hTfmsof3zfCheicb&grc67v}x|T zn!CbbwsIDNbQ>A3#PIkcR|-b;mRE5W42m&p&eV)n%}~q==J#j~D)qE$@!49ugIUvR z#&*uQJG6$v=lz!NBldXyva6N_BeaT8IzmxNtnh(kh~FZR$SfPX`2;_a=nFh?@R(ru zpcBR3=fkhyCj{TgWdp)%#^nrgnI8(q&{QYux+#s*bTGAP{iewTADi5A=K6XuRdvs) z@|Q+w>Z)G(BkKaZ*ZYZE%YZB1gkih H%Nzd(9_d*o literal 0 HcmV?d00001 diff --git a/requests/structures.py b/requests/structures.py new file mode 100644 index 0000000..05f5ac1 --- /dev/null +++ b/requests/structures.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. + +""" + +import os +from itertools import islice + + +class IteratorProxy(object): + """docstring for IteratorProxy""" + def __init__(self, i): + self.i = i + # self.i = chain.from_iterable(i) + + def __iter__(self): + return self.i + + def __len__(self): + if hasattr(self.i, '__len__'): + return len(self.i) + if hasattr(self.i, 'len'): + return self.i.len + if hasattr(self.i, 'fileno'): + return os.fstat(self.i.fileno()).st_size + + def read(self, n): + return "".join(islice(self.i, None, n)) + + +class CaseInsensitiveDict(dict): + """Case-insensitive Dictionary + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header.""" + + @property + def lower_keys(self): + if not hasattr(self, '_lower_keys') or not self._lower_keys: + self._lower_keys = dict((k.lower(), k) for k in list(self.keys())) + return self._lower_keys + + def _clear_lower_keys(self): + if hasattr(self, '_lower_keys'): + self._lower_keys.clear() + + def __setitem__(self, key, value): + dict.__setitem__(self, key, value) + self._clear_lower_keys() + + def __delitem__(self, key): + dict.__delitem__(self, self.lower_keys.get(key.lower(), key)) + self._lower_keys.clear() + + def __contains__(self, key): + return key.lower() in self.lower_keys + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + if key in self: + return dict.__getitem__(self, self.lower_keys[key.lower()]) + + def get(self, key, default=None): + if key in self: + return self[key] + else: + return default + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super(LookupDict, self).__init__() + + def __repr__(self): + return '' % (self.name) + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/requests/structures.pyc b/requests/structures.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73c86f884945519a5ceff85d4c6fd6ab506e342e GIT binary patch literal 4707 zcmcIo?QR=I6rHslCw5b{^dqIE&_$)hMNLuxLP$gf)d8sjS!Gg+2&y)VJ#IGH?7BOX zwn2qI;Su1icmp1T2Y_?#ti4WYf5o_++u8Zr`*H4>yRH9yy8Y*0e|+0l<*$x^zd*A) z5Cf&QAOkh1sWebq=-_W%r8Tu*S6g)z3>wNb)DWX{>Nlm1l=@+7P7RvMG-Y&tGCHpY z3**t&WORW?Z+6;z<9&#BVV)cq>+Gs^#X;X46vnoH{qL{c-iTcsR*OQn6T5JfKQl$B z$7i(L$v^n@IsuM$O^C#%N#D5B=-zXth+SUXFY@Py6Z^UHE}H!i!oYr*23e!!Fc3CF zVRjmH1UoRdA)Thuo1HoCeG6ic_n}>qJr0L?5gvb84fEsH+qKGVtD{4= zfXz{qWQmKSH_*2{Tm^l;cicqFc?>|sU4@8o!t3XC;j^wo%vdV~DT*%Q+?TcDyF@Ff zqnuYv@Oe~I#Wm$>qH3Uy0<~F9*A%BeE9Z8By=ty5b3^6oYPT_7F-J_}jNPW%9MEuv zpy%j{C`wHhMOdyBdV;TEf?nR?w5-{QZR}hjKGHHu=jPTCCqwIEr|EuKYh7fMpN+V7 zmafzU{+noa5kdv$g41Yiv_6$#qc-BqtLOmf@Tn6x!b7kc&^&^7;7NgD4?aVn=?OvP zZk}YCLt>^3_43TfS}_D?DV5C%8GLVH;z5XiOH_D=dmv}=zClz-DN(ea4-Qg3`hX!R zqe$}rO_RklnwYP2lirCEO4HgiXqGxOgJ#fbwCb$|cOH-3*qVEpHJMFZ^3-f3eb>jZ z{1}P5X!aq50kw>|$AEQ&eh>l@k7pndk7uCfn1R5tLc?32)uwP#i>x~U3uEIc@>7fF z{|-S#R+37Skg6nk78i%@c8K3spe^$}-XEprR=B;r1CN`+{@;k!ua;Omc!&m$C9NPqs_we8| z6b?Y@F4`+)W-bw|9Xa_&0B zbS%Nr3>y3kRz}xnfIuqopRi+*b2V)nL>1R^7eGjrt0NhhJok!~MJuHoAsEZz$KuZGvzKrX+)AgdiQ_ z^pDX>gU-K#{Xd}s6NAKzU1Sy_B$>r)KrT=*agKN55nMB6C0Tab%7I}OLMz|q(KPU} zarzRM5w7|ji0You%)D9IdmU%7E-LN4QQ1p?bvZ*quJT(9-@`p$7B^hxRi*O(kCu*C zauktMV~}wat>bxI>QDi;3E-Ib#FCQFclWD z@&7STzmNBSj^=|&ZOI_x8|A#%NV{*aWPs9pEQYyi!YLIV_)V>!kyhZ`kEK{(chOn1Qpb z=F88u!i?}?#H#ycwwQQa*i97W4JEZCd7)%CE-TMsy@0a_Cc)~IduK_=%!ThJ3fCw1 z>1!3{eOf8Z7-%w}PbKaWzX}!TWjxLb2XqAf-(&3AUT1;tI-dVNsfieUi$W5e8!IKG zcQQm0@n55jza(mllHF3p3k~TuW*y5v5PISAJhk#ACLg0d7v*zA*k33^vS^k{3W(PI Tht?fx;*|y0pRF%lTw4AYBz~p@ literal 0 HcmV?d00001 diff --git a/requests/utils.py b/requests/utils.py new file mode 100644 index 0000000..a2d434e --- /dev/null +++ b/requests/utils.py @@ -0,0 +1,591 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. + +""" + +import cgi +import codecs +import os +import platform +import re +import sys +import zlib +from netrc import netrc, NetrcParseError + +from . import __version__ +from . import certs +from .compat import parse_http_list as _parse_list_header +from .compat import quote, urlparse, bytes, str, OrderedDict, urlunparse +from .cookies import RequestsCookieJar, cookiejar_from_dict + +_hush_pyflakes = (RequestsCookieJar,) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + if hasattr(o, '__len__'): + return len(o) + if hasattr(o, 'len'): + return o.len + if hasattr(o, 'fileno'): + return os.fstat(o.fileno()).st_size + + +def get_netrc_auth(url): + """Returns the Requests tuple auth for a given url from netrc.""" + + try: + locations = (os.path.expanduser('~/{0}'.format(f)) for f in NETRC_FILES) + netrc_path = None + + for loc in locations: + if os.path.exists(loc) and not netrc_path: + netrc_path = loc + + # Abort early if there isn't one. + if netrc_path is None: + return netrc_path + + ri = urlparse(url) + + # Strip port numbers from netloc + host = ri.netloc.split(':')[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth + pass + + # AppEngine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if name and name[0] != '<' and name[-1] != '>': + return os.path.basename(name) + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + ValueError: need more than 1 value to unpack + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples. + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, dict): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + """ + + cj2 = cookiejar_from_dict(cookie_dict) + cj.update(cj2) + return cj + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + + charset_re = re.compile(r']', flags=re.I) + + return charset_re.findall(content) + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = cgi.parse_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode('', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + + 2. every encodings from ```` + + 3. fall back and replace all unicode characters + + """ + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +def stream_decompress(iterator, mode='gzip'): + """Stream decodes an iterator over compressed data + + :param iterator: An iterator over compressed data + :param mode: 'gzip' or 'deflate' + :return: An iterator over decompressed data + """ + + if mode not in ['gzip', 'deflate']: + raise ValueError('stream_decompress mode must be gzip or deflate') + + zlib_mode = 16 + zlib.MAX_WBITS if mode == 'gzip' else -zlib.MAX_WBITS + dec = zlib.decompressobj(zlib_mode) + try: + for chunk in iterator: + rv = dec.decompress(chunk) + if rv: + yield rv + except zlib.error: + # If there was an error decompressing, just return the raw chunk + yield chunk + # Continue to return the rest of the raw data + for chunk in iterator: + yield chunk + else: + # Make sure everything has been returned from the decompression object + buf = dec.decompress(bytes()) + rv = buf + dec.flush() + if rv: + yield rv + + +def stream_untransfer(gen, resp): + ce = resp.headers.get('content-encoding', '').lower() + if 'gzip' in ce: + gen = stream_decompress(gen, mode='gzip') + elif 'deflate' in ce: + gen = stream_decompress(gen, mode='deflate') + + return gen + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + c = chr(int(h, 16)) + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + """ + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, unreserved, + # or '%') + return quote(unquote_unreserved(uri), safe="!#$%&'()*+,/:;=?@[]~") + + +def get_environ_proxies(url): + """Return a dict of environment proxies.""" + + proxy_keys = [ + 'all', + 'http', + 'https', + 'ftp', + 'socks' + ] + + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy = get_proxy('no_proxy') + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the netloc, both with and without the port. + no_proxy = no_proxy.split(',') + netloc = urlparse(url).netloc + + for host in no_proxy: + if netloc.endswith(host) or netloc.split(':')[0].endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return {} + + # If we get here, we either didn't have no_proxy set or we're not going + # anywhere that no_proxy applies to. + proxies = [(key, get_proxy(key + '_proxy')) for key in proxy_keys] + return dict([(key, val) for (key, val) in proxies if val]) + + +def default_user_agent(): + """Return a string representing the default user agent.""" + _implementation = platform.python_implementation() + + if _implementation == 'CPython': + _implementation_version = platform.python_version() + elif _implementation == 'PyPy': + _implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + _implementation_version = ''.join([_implementation_version, sys.pypy_version_info.releaselevel]) + elif _implementation == 'Jython': + _implementation_version = platform.python_version() # Complete Guess + elif _implementation == 'IronPython': + _implementation_version = platform.python_version() # Complete Guess + else: + _implementation_version = 'Unknown' + + try: + p_system = platform.system() + p_release = platform.release() + except IOError: + p_system = 'Unknown' + p_release = 'Unknown' + + return " ".join(['python-requests/%s' % __version__, + '%s/%s' % (_implementation, _implementation_version), + '%s/%s' % (p_system, p_release)]) + + +def default_headers(): + return { + 'User-Agent': default_user_agent(), + 'Accept-Encoding': ', '.join(('gzip', 'deflate', 'compress')), + 'Accept': '*/*' + } + + +def parse_header_links(value): + """Return a dict of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + + """ + + links = [] + + replace_chars = " '\"" + + for val in value.split(","): + try: + url, params = val.split(";", 1) + except ValueError: + url, params = val, '' + + link = {} + + link["url"] = url.strip("<> '\"") + + for param in params.split(";"): + try: + key, value = param.split("=") + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + '''Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument.''' + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password.""" + if url: + parsed = urlparse(url) + return (parsed.username, parsed.password) + else: + return ('', '') diff --git a/requests/utils.pyc b/requests/utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0059afc389a8a2ab84981e3e35b306653166a842 GIT binary patch literal 17365 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 literal 0 HcmV?d00001 diff --git a/testkit-lite b/testkit-lite index 22b4f9d..eeaf38a 100755 --- a/testkit-lite +++ b/testkit-lite @@ -32,18 +32,12 @@ import xml.etree.ElementTree as etree from optparse import OptionParser, make_option from datetime import datetime -# check if '/usr/lib/python2.7/dist-packages' in sys path -if '/usr/lib/python2.7/dist-packages' not in sys.path: - sys.path.append('/usr/lib/python2.7/dist-packages/') -if '/usr/share/pyshared' not in sys.path: - sys.path.append('/usr/share/pyshared/') - # import logger try: from commodule.log import LOGGER except ImportError, e: print "[ Error: loading logging failed, error: %s ]\n" % e - print "try to run command " \ + print "please try to set PYTHONPATH for current system" \ "'export PYTHONPATH=/usr/lib/python2.7/dist-packages' and " \ "'export PYTHONPATH=/usr/share/pyshared/' to resolve this issue" sys.exit(1) @@ -52,10 +46,10 @@ except ImportError, e: try: from testkitlite.common.process_killall import kill_testkit_lite except ImportError, e: - LOGGER.error("[ Error: loading module killall failed, error: %s ]\n" % e) - LOGGER.info("try to run command \ -'export PYTHONPATH=/usr/lib/python2.7/dist-packages' and \ -'export PYTHONPATH=/usr/share/pyshared/' to resolve this issue") + print "[ Error: loading killall failed, error: %s ]\n" % e + print "please try to set PYTHONPATH for current system" \ + "'export PYTHONPATH=/usr/lib/python2.7/dist-packages' and " \ + "'export PYTHONPATH=/usr/share/pyshared/' to resolve this issue" sys.exit(1) JOIN = os.path.join @@ -64,13 +58,13 @@ DIRNAME = os.path.dirname BASENAME = os.path.basename ABSPATH = os.path.abspath -TESTKIT_DIR = "/opt/testkit/lite" +TESTKIT_DIR = os.getcwd() if not platform.system() == "Linux": TESTKIT_DIR = DIRNAME(ABSPATH(__file__)) sys.path += [JOIN(TESTKIT_DIR)] TESTKIT_DIR = JOIN(TESTKIT_DIR, "results") -LOG_DIR = TESTKIT_DIR +LOG_DIR = JOIN(TESTKIT_DIR, 'result') PID_FILE = JOIN(LOG_DIR, "pid.log") TEST_PACKAGES_DIR = JOIN(TESTKIT_DIR, "test_packages") COMMON_FILTERS = { @@ -86,13 +80,14 @@ COMMON_FILTERS = { # start testkit-lite in Singleton mode kill_testkit_lite(PID_FILE) -if not platform.system() == "Linux": +if platform.system() == "Linux": try: if not os.path.exists(LOG_DIR): os.makedirs(LOG_DIR) except OSError, e: - LOGGER.error("[ Error: create results directory:" - " %s failed, error: %s ]\n" % (LOG_DIR, e)) + LOGGER.error("[ Error: " + "create results directory: %s failed," + " error: %s ]\n" % (LOG_DIR, e)) try: with open(PID_FILE, "w") as fd: @@ -108,12 +103,13 @@ try: except OSError, e: pass + # detect version option if "--version" in sys.argv: try: CONFIG = ConfigParser.ConfigParser() if platform.system() == "Linux": - CONFIG.read('/opt/testkit/lite/VERSION') + CONFIG.read('VERSION') else: VERSION_FILE = os.path.join(sys.path[0], 'VERSION') CONFIG.read(VERSION_FILE) @@ -129,7 +125,7 @@ if "--internal-version" in sys.argv: try: CONFIG = ConfigParser.ConfigParser() if platform.system() == "Linux": - CONFIG.read('/opt/testkit/lite/VERSION') + CONFIG.read('VERSION') else: VERSION_FILE = os.path.join(sys.path[0], 'VERSION') CONFIG.read(VERSION_FILE) @@ -236,10 +232,10 @@ forms: %%prog -f [prefix:]\"/test.xml\"\n\ %%prog -f [prefix:]\"/test.xml\" -D -A --type type1 --capability --comm \n\ %%prog -f [prefix:]\"/test.xml\" -D -A --type type1 --status ready ...\n\ exmaples: \n\ - run a web test package from device side with device WRT (it is default): \n\ - %%prog -f device:\"/usr/share/webapi-webkit-tests/tests.xml\" -e 'WRTLauncher' -A \n\ + run a web test package from device side with device WRT: \n\ + %%prog -f device:\"/usr/share/webapi-webkit-tests/tests.xml\" -e 'WRTLauncher' -A --comm tizenmobile\n\ run a web test package from local path with chrome browser: \n\ - %%prog -f \"/usr/share/webapi-webkit-tests/tests.xml\" -e '/chrome-startup' -A --comm localhost \n\ + %%prog -f \"/usr/share/webapi-webkit-tests/tests.xml\" -e '/chrome-startup' -A \n\ \n\ Note: \n\ 1) Proxy settings should be disabled when execute webapi packages\n\ @@ -281,7 +277,7 @@ Note: \n\ raise ValueError("For single mode, pls set local file to test ") COMMODULE_TYPE = OPTIONS.commodule else: - COMMODULE_TYPE = "tizenmobile" + COMMODULE_TYPE = "localhost" CONNECTOR = Connector({"testremote": COMMODULE_TYPE}).get_connector() if CONNECTOR == None: diff --git a/testkitlite/engines/default/runner.py b/testkitlite/engines/default/runner.py index 890484f..5c5c921 100644 --- a/testkitlite/engines/default/runner.py +++ b/testkitlite/engines/default/runner.py @@ -335,6 +335,9 @@ class TRunner: self.current_test_xml = JOIN(latest_dir, webapi_total_file) self.__run_with_commodule(webapi_file) + import glob, shutil + for sfile in glob.glob(JOIN(latest_dir, "../xsd/*.*")): + shutil.copy(sfile, latest_dir) def __run_with_commodule(self, webapi_file): """run_with_commodule,Initialization,check status,get result""" @@ -981,7 +984,7 @@ def get_version_info(): try: config = ConfigParser.ConfigParser() if platform.system() == "Linux": - config.read('/opt/testkit/lite/VERSION') + config.read('VERSION') else: version_file = os.path.join(sys.path[0], 'VERSION') config.read(version_file) diff --git a/tests/chrome-startup b/tests/chrome-startup old mode 100644 new mode 100755 diff --git a/web/index.html b/web/index.html index 00933ae..3973349 100644 --- a/web/index.html +++ b/web/index.html @@ -707,7 +707,7 @@ table#results td {\ } function close_window(){ - //for webapi-nonw3c-webgl-tests run by tizen-tool emulator html,window.parent.close() no function,must call window.close, why? + //for tct-webgl-tests run by tizen-tool emulator html,window.parent.close() no function,must call window.close, why? if(window.parent != window.self){ window.open('','_self',''); window.close(); -- 2.7.4