Browse Source

noversionēti visi faili

Ivars 6 years ago
parent
commit
48846a8083
100 changed files with 36124 additions and 28 deletions
  1. 129
    27
      Contents/Code/__init__.py
  2. 1894
    0
      Contents/Code/project.wpr
  3. 320
    0
      Contents/Code/wingdbstub.py
  4. 8
    1
      Contents/DefaultPrefs.json
  5. 0
    0
      Contents/Libraries/Shared/__init__.py
  6. 86
    0
      Contents/Libraries/Shared/requests/__init__.py
  7. 42
    0
      Contents/Libraries/Shared/requests/_internal_utils.py
  8. 503
    0
      Contents/Libraries/Shared/requests/adapters.py
  9. 148
    0
      Contents/Libraries/Shared/requests/api.py
  10. 252
    0
      Contents/Libraries/Shared/requests/auth.py
  11. 5616
    0
      Contents/Libraries/Shared/requests/cacert.pem
  12. 25
    0
      Contents/Libraries/Shared/requests/certs.py
  13. 66
    0
      Contents/Libraries/Shared/requests/compat.py
  14. 540
    0
      Contents/Libraries/Shared/requests/cookies.py
  15. 114
    0
      Contents/Libraries/Shared/requests/exceptions.py
  16. 34
    0
      Contents/Libraries/Shared/requests/hooks.py
  17. 873
    0
      Contents/Libraries/Shared/requests/models.py
  18. 36
    0
      Contents/Libraries/Shared/requests/packages/__init__.py
  19. 32
    0
      Contents/Libraries/Shared/requests/packages/chardet/__init__.py
  20. 925
    0
      Contents/Libraries/Shared/requests/packages/chardet/big5freq.py
  21. 42
    0
      Contents/Libraries/Shared/requests/packages/chardet/big5prober.py
  22. 80
    0
      Contents/Libraries/Shared/requests/packages/chardet/chardetect.py
  23. 231
    0
      Contents/Libraries/Shared/requests/packages/chardet/chardistribution.py
  24. 106
    0
      Contents/Libraries/Shared/requests/packages/chardet/charsetgroupprober.py
  25. 62
    0
      Contents/Libraries/Shared/requests/packages/chardet/charsetprober.py
  26. 61
    0
      Contents/Libraries/Shared/requests/packages/chardet/codingstatemachine.py
  27. 34
    0
      Contents/Libraries/Shared/requests/packages/chardet/compat.py
  28. 39
    0
      Contents/Libraries/Shared/requests/packages/chardet/constants.py
  29. 44
    0
      Contents/Libraries/Shared/requests/packages/chardet/cp949prober.py
  30. 86
    0
      Contents/Libraries/Shared/requests/packages/chardet/escprober.py
  31. 242
    0
      Contents/Libraries/Shared/requests/packages/chardet/escsm.py
  32. 90
    0
      Contents/Libraries/Shared/requests/packages/chardet/eucjpprober.py
  33. 596
    0
      Contents/Libraries/Shared/requests/packages/chardet/euckrfreq.py
  34. 42
    0
      Contents/Libraries/Shared/requests/packages/chardet/euckrprober.py
  35. 428
    0
      Contents/Libraries/Shared/requests/packages/chardet/euctwfreq.py
  36. 41
    0
      Contents/Libraries/Shared/requests/packages/chardet/euctwprober.py
  37. 472
    0
      Contents/Libraries/Shared/requests/packages/chardet/gb2312freq.py
  38. 41
    0
      Contents/Libraries/Shared/requests/packages/chardet/gb2312prober.py
  39. 283
    0
      Contents/Libraries/Shared/requests/packages/chardet/hebrewprober.py
  40. 569
    0
      Contents/Libraries/Shared/requests/packages/chardet/jisfreq.py
  41. 227
    0
      Contents/Libraries/Shared/requests/packages/chardet/jpcntx.py
  42. 229
    0
      Contents/Libraries/Shared/requests/packages/chardet/langbulgarianmodel.py
  43. 329
    0
      Contents/Libraries/Shared/requests/packages/chardet/langcyrillicmodel.py
  44. 225
    0
      Contents/Libraries/Shared/requests/packages/chardet/langgreekmodel.py
  45. 201
    0
      Contents/Libraries/Shared/requests/packages/chardet/langhebrewmodel.py
  46. 225
    0
      Contents/Libraries/Shared/requests/packages/chardet/langhungarianmodel.py
  47. 200
    0
      Contents/Libraries/Shared/requests/packages/chardet/langthaimodel.py
  48. 139
    0
      Contents/Libraries/Shared/requests/packages/chardet/latin1prober.py
  49. 86
    0
      Contents/Libraries/Shared/requests/packages/chardet/mbcharsetprober.py
  50. 54
    0
      Contents/Libraries/Shared/requests/packages/chardet/mbcsgroupprober.py
  51. 572
    0
      Contents/Libraries/Shared/requests/packages/chardet/mbcssm.py
  52. 120
    0
      Contents/Libraries/Shared/requests/packages/chardet/sbcharsetprober.py
  53. 69
    0
      Contents/Libraries/Shared/requests/packages/chardet/sbcsgroupprober.py
  54. 91
    0
      Contents/Libraries/Shared/requests/packages/chardet/sjisprober.py
  55. 170
    0
      Contents/Libraries/Shared/requests/packages/chardet/universaldetector.py
  56. 76
    0
      Contents/Libraries/Shared/requests/packages/chardet/utf8prober.py
  57. 1
    0
      Contents/Libraries/Shared/requests/packages/idna/__init__.py
  58. 118
    0
      Contents/Libraries/Shared/requests/packages/idna/codec.py
  59. 12
    0
      Contents/Libraries/Shared/requests/packages/idna/compat.py
  60. 387
    0
      Contents/Libraries/Shared/requests/packages/idna/core.py
  61. 1584
    0
      Contents/Libraries/Shared/requests/packages/idna/idnadata.py
  62. 46
    0
      Contents/Libraries/Shared/requests/packages/idna/intranges.py
  63. 7267
    0
      Contents/Libraries/Shared/requests/packages/idna/uts46data.py
  64. 96
    0
      Contents/Libraries/Shared/requests/packages/urllib3/__init__.py
  65. 324
    0
      Contents/Libraries/Shared/requests/packages/urllib3/_collections.py
  66. 330
    0
      Contents/Libraries/Shared/requests/packages/urllib3/connection.py
  67. 866
    0
      Contents/Libraries/Shared/requests/packages/urllib3/connectionpool.py
  68. 0
    0
      Contents/Libraries/Shared/requests/packages/urllib3/contrib/__init__.py
  69. 231
    0
      Contents/Libraries/Shared/requests/packages/urllib3/contrib/appengine.py
  70. 115
    0
      Contents/Libraries/Shared/requests/packages/urllib3/contrib/ntlmpool.py
  71. 358
    0
      Contents/Libraries/Shared/requests/packages/urllib3/contrib/pyopenssl.py
  72. 172
    0
      Contents/Libraries/Shared/requests/packages/urllib3/contrib/socks.py
  73. 209
    0
      Contents/Libraries/Shared/requests/packages/urllib3/exceptions.py
  74. 178
    0
      Contents/Libraries/Shared/requests/packages/urllib3/fields.py
  75. 94
    0
      Contents/Libraries/Shared/requests/packages/urllib3/filepost.py
  76. 5
    0
      Contents/Libraries/Shared/requests/packages/urllib3/packages/__init__.py
  77. 0
    0
      Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/__init__.py
  78. 53
    0
      Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/makefile.py
  79. 259
    0
      Contents/Libraries/Shared/requests/packages/urllib3/packages/ordered_dict.py
  80. 868
    0
      Contents/Libraries/Shared/requests/packages/urllib3/packages/six.py
  81. 13
    0
      Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py
  82. 105
    0
      Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py
  83. 367
    0
      Contents/Libraries/Shared/requests/packages/urllib3/poolmanager.py
  84. 151
    0
      Contents/Libraries/Shared/requests/packages/urllib3/request.py
  85. 530
    0
      Contents/Libraries/Shared/requests/packages/urllib3/response.py
  86. 46
    0
      Contents/Libraries/Shared/requests/packages/urllib3/util/__init__.py
  87. 144
    0
      Contents/Libraries/Shared/requests/packages/urllib3/util/connection.py
  88. 72
    0
      Contents/Libraries/Shared/requests/packages/urllib3/util/request.py
  89. 74
    0
      Contents/Libraries/Shared/requests/packages/urllib3/util/response.py
  90. 300
    0
      Contents/Libraries/Shared/requests/packages/urllib3/util/retry.py
  91. 320
    0
      Contents/Libraries/Shared/requests/packages/urllib3/util/ssl_.py
  92. 242
    0
      Contents/Libraries/Shared/requests/packages/urllib3/util/timeout.py
  93. 217
    0
      Contents/Libraries/Shared/requests/packages/urllib3/util/url.py
  94. 712
    0
      Contents/Libraries/Shared/requests/sessions.py
  95. 91
    0
      Contents/Libraries/Shared/requests/status_codes.py
  96. 105
    0
      Contents/Libraries/Shared/requests/structures.py
  97. 817
    0
      Contents/Libraries/Shared/requests/utils.py
  98. BIN
      Contents/Resources/art-default.jpg
  99. BIN
      Contents/Resources/back.png
  100. 0
    0
      Contents/Resources/cinemalive.png

+ 129
- 27
Contents/Code/__init__.py View File

1
-VERSION = "0.1.6"
1
+
2
+Log("\n*** PlayStream started ***\n")
3
+try:
4
+    import wingdbstub
5
+except:
6
+    pass
7
+
8
+VERSION = "0.1.27"
2
 CHANNEL_NAME = "PlayStream"
9
 CHANNEL_NAME = "PlayStream"
3
 PREFIX   = '/video/playstream'
10
 PREFIX   = '/video/playstream'
4
 DEV = True if Platform.MachineIdentifier == 'Unit testing' else False
11
 DEV = True if Platform.MachineIdentifier == 'Unit testing' else False
5
-
12
+REPO_URL = "http://home.blue.lv/files/PlayStream.bundle/"
6
 ART = "art-default.jpg"
13
 ART = "art-default.jpg"
7
 ICON = "icon-default.png"
14
 ICON = "icon-default.png"
8
 BACK = "back.png"
15
 BACK = "back.png"
10
 VIDEO = "video.png"
17
 VIDEO = "video.png"
11
 SEARCH = "folder_search.png"
18
 SEARCH = "folder_search.png"
12
 PREFS = "prefs.png"
19
 PREFS = "prefs.png"
20
+UPDATE = "update.png"
13
 
21
 
14
 import sys, os, re
22
 import sys, os, re
15
-import traceback, glob, inspect, urllib
23
+import traceback, glob, inspect, urllib, zipfile
24
+import requests
25
+
16
 import content
26
 import content
17
 from content.ContentSources import ContentSources
27
 from content.ContentSources import ContentSources
18
 from content import util
28
 from content import util
20
 import Framework
30
 import Framework
21
 #from Framework.api.objectkit import *
31
 #from Framework.api.objectkit import *
22
 from DumbTools import DumbKeyboard, DumbPrefs
32
 from DumbTools import DumbKeyboard, DumbPrefs
33
+#C:\Users\user\AppData\Local\Plex Media Server\Plug-ins
34
+tmp_dir = Core.storage.join_path(Core.app_support_path, "Cache")
35
+plugins_dir = Core.storage.join_path(Core.app_support_path, "Plug-ins", "")
36
+#Log("tmp_dir= "+tmp_dir)
23
 
37
 
24
 sources_directory = os.path.join(os.path.dirname(inspect.getsourcefile(content)), "sources")
38
 sources_directory = os.path.join(os.path.dirname(inspect.getsourcefile(content)), "sources")
25
-sources = ContentSources(sources_directory)
39
+use_streams_file_remote = Prefs["general_use_streams_file_remote"]
40
+if Prefs["general_use_streams_file_remote"]:
41
+    try:
42
+        sources = ContentSources(sources_directory, Prefs["general_streams_file_remote"])
43
+    except:
44
+        Log("Can not open remote streams file, fallback to local")
45
+        sources = ContentSources(sources_directory, Prefs["general_streams_file"])
46
+else:
47
+    sources = ContentSources(sources_directory, Prefs["general_streams_file"])
48
+cfg = sources.plugins["config"]
26
 data0 = None
49
 data0 = None
27
 title0 = None
50
 title0 = None
28
 history = []
51
 history = []
78
         if not DEV:
101
         if not DEV:
79
             sources.plugins[source].options_write(options)
102
             sources.plugins[source].options_write(options)
80
 
103
 
104
+    if Prefs["general_use_streams_file_remote"]:
105
+        cfg.set_streams_file(Prefs["general_streams_file_remote"])
106
+    else:
107
+        cfg.set_streams_file(Prefs["general_streams_file"])
108
+
81
 ####################################################################################################
109
 ####################################################################################################
82
 @handler(PREFIX, CHANNEL_NAME, art=ART, thumb=ICON)
110
 @handler(PREFIX, CHANNEL_NAME, art=ART, thumb=ICON)
83
 def Main():
111
 def Main():
101
     data2 = data.format(query)
129
     data2 = data.format(query)
102
     return Menu(data2, title)
130
     return Menu(data2, title)
103
 
131
 
132
+
133
+
104
 @route(PREFIX+'/{data}')
134
 @route(PREFIX+'/{data}')
105
 def Menu(data, title, **kwargs):
135
 def Menu(data, title, **kwargs):
106
-         #includeBandwidths=1, checkFiles=0, includeConcerts=0, includeExtras=0, includeOnDeck=0, includePopularLeaves=1&includeChapters=1&checkFiles=1):
136
+            #includeBandwidths=1, checkFiles=0, includeConcerts=0, includeExtras=0, includeOnDeck=0, includePopularLeaves=1&includeChapters=1&checkFiles=1):
107
 
137
 
108
     global data0, title0, history
138
     global data0, title0, history
109
     #sources.plugins["config"].read_streams()
139
     #sources.plugins["config"].read_streams()
112
         data = u"config::home"
142
         data = u"config::home"
113
 
143
 
114
     # Process history
144
     # Process history
115
-    if data == "back":
116
-        data = history[-1][0].replace("/", "%2F") if history and history[-1][0] else "config::home"
117
-        title = history[-1][1] if history and history[-1][0] else "Home"
118
-    if data == data0 or (len(history) > 2 and data == history[-2]):
119
-        # fake call, skipped
120
-        Log("history skipped")
121
-    else:
122
-        if history and history[-1][0] and data == history[-1][0]:
123
-            history.pop()
124
-            Log("history poped")
125
-        else:
126
-            history.append((data0, title0))
127
-            Log("history added %s" % data0)
128
-    data0 = data
129
-    title0 = title
130
-    data = data.replace("%2F", "/")
131
-    hst = ""
132
-    for h in history: hst += "\n%s" % h[0]
145
+    #if data == "back":
146
+    #    data = history[-1][0].replace("/", "%2F") if history and history[-1][0] else "config::home"
147
+    #    title = history[-1][1] if history and history[-1][0] else "Home"
148
+    #if data == data0 or (len(history) > 2 and data == history[-2]):
149
+    #    # fake call, skipped
150
+    #    Log("history skipped")
151
+    #else:
152
+    #    if history and history[-1][0] and data == history[-1][0]:
153
+    #        history.pop()
154
+    #        Log("history poped")
155
+    #    else:
156
+    #        history.append((data0, title0))
157
+    #        Log("history added %s" % data0)
158
+    #hst = ""
159
+    #for h in history: hst += "\n%s" % h[0]
133
     #Log("[playstream] history="+hst)
160
     #Log("[playstream] history="+hst)
161
+    #
162
+    #data0 = data
163
+    #title0 = title
164
+
165
+    data = data.replace("%2F", "/")
134
 
166
 
135
     ### Processig call ###
167
     ### Processig call ###
136
     Log("[playstream] processing data=%s"%data)
168
     Log("[playstream] processing data=%s"%data)
160
                 summary=desc,
192
                 summary=desc,
161
                 thumb=thumb_data(img, video=True)
193
                 thumb=thumb_data(img, video=True)
162
             )
194
             )
163
-            for stream in streams:
195
+            for i, stream in enumerate(streams):
196
+                headers = stream["headers"] if "headers" in stream and stream["headers"] else {"User-Agent":"Plex"}
197
+                lang = stream["lang"] if "lang" in stream else "?"
198
+                quality = stream["quality"] if "quality" in stream else "stream%s" % i
199
+                resolution = "%s %s" % (lang, quality)
200
+                if isinstance(resolution,str):
201
+                    resolution = resolution.decode("utf8")
202
+                Log(resolution)
203
+                height = "720" #"720"
204
+                width = "1280" #"1280"
164
                 vco.add(MediaObject(
205
                 vco.add(MediaObject(
165
-                    #bitraate=0,
166
-                    #container=Container.MPEGTS
206
+                    #bitrate=0,
207
+                    #container=Container.MPEGTS,
208
+                    video_resolution = resolution,
209
+                    height = height,
210
+                    width = width,
167
                     optimized_for_streaming = True,
211
                     optimized_for_streaming = True,
168
-                    parts=[PartObject(key=HTTPLiveStreamURL(stream["url"]))]
212
+                    parts=[PartObject(
213
+                        key=HTTPLiveStreamURL(stream["url"]),
214
+                        http_headers = headers
215
+                    )]
169
                 ))
216
                 ))
170
             include_container = True
217
             include_container = True
171
             return ObjectContainer(objects = [vco]) if include_container else vco
218
             return ObjectContainer(objects = [vco]) if include_container else vco
184
     Log( "[playstream] %s items returned"%len(content))
231
     Log( "[playstream] %s items returned"%len(content))
185
 
232
 
186
     for item in content:
233
     for item in content:
234
+        if item[1] == "back": continue  # nerādam back
187
         data2 = item[1]
235
         data2 = item[1]
188
         #data2 = urllib.quote(data2, safe="")
236
         #data2 = urllib.quote(data2, safe="")
189
         data2 = data2.replace("/", "%2F")
237
         data2 = data2.replace("/", "%2F")
238
+        data2 = data2 if isinstance(data2, unicode) else data2.decode("utf8")
190
         title = item[0] if isinstance(item[0], unicode) else item[0].decode("utf8")
239
         title = item[0] if isinstance(item[0], unicode) else item[0].decode("utf8")
191
         if not title: title = "Title"
240
         if not title: title = "Title"
192
         img = item[2]  #if isinstance(item[2], unicode) else item[2].decode("utf8")
241
         img = item[2]  #if isinstance(item[2], unicode) else item[2].decode("utf8")
196
         if "{0}" in data2:
245
         if "{0}" in data2:
197
             #q = "aaa"  # TODO InputDirectoryObject
246
             #q = "aaa"  # TODO InputDirectoryObject
198
             ##data = data.format(q)
247
             ##data = data.format(q)
248
+            #TODO problēma ar latviešu burtiem iekš DumbInput
199
             if Client.Product in DumbKeyboard.clients:
249
             if Client.Product in DumbKeyboard.clients:
200
                 DumbKeyboard(PREFIX, oc, Search,
250
                 DumbKeyboard(PREFIX, oc, Search,
201
                             dktitle = title,
251
                             dktitle = title,
244
                 art=R(ART)
294
                 art=R(ART)
245
             ))
295
             ))
246
         ValidatePrefs()
296
         ValidatePrefs()
297
+        version2 = get_repo_version()
298
+        if version2 > VERSION:
299
+            msg = "Update from %s to %s" % (VERSION, version2)
300
+        else:
301
+            msg = "Current version - %s" % (VERSION)
302
+        oc.add(DirectoryObject(
303
+            key=Callback(UpdateMenu),
304
+            title = msg,
305
+            thumb = R(UPDATE),
306
+            summary ="Check whether update exist and offer to update"
307
+        ))
308
+
309
+    return oc
310
+
311
+#@route(PREFIX+'/updatemenu')
312
+def UpdateMenu():
313
+    Log("UpdateMenu")
314
+    version2 = get_repo_version()
315
+    if version2 > VERSION:
316
+        msg = "Current version - %s, new version available - %s" % (VERSION, version2)
317
+    else:
318
+        msg = "Current version - %s, no new version available" % (VERSION)
319
+    oc = ObjectContainer(title1=msg, title2=msg, no_history=True)
320
+    oc.add(DirectoryObject(key=Callback(UpdatePlugin, ver=version2), title="Update plugin", summary=msg, thumb = R(UPDATE)))
247
     return oc
321
     return oc
248
 
322
 
323
+# @route(PREFIX+'/updateplugin')
324
+def UpdatePlugin(ver):
325
+    Log("UpdatePlugin")
326
+    Log("ver="+ver)
327
+    if not ver:
328
+        ver = get_repo_version()
329
+        #return ObjectContainer(header="Error", message="ver=" % ver)
330
+    fname = "PlayStream.bundle-%s.zip" % ver
331
+    url = REPO_URL + fname
332
+    path = os.path.join(tmp_dir, fname)
333
+    try:
334
+        urllib.urlretrieve(url, path)
335
+    except:
336
+        return ObjectContainer(header="Error", message="Can not download \n%s" % url)
337
+    with zipfile.ZipFile(path,"r") as zip_ref:
338
+        zip_ref.extractall(plugins_dir)
339
+    return ObjectContainer(header="Info", message="Plugin version updated to %s, reload plugin" % ver)
340
+
341
+def get_repo_version():
342
+    r = requests.get(REPO_URL)
343
+    if r.status_code <> 200:
344
+        raise Exception("Can not reach repo")
345
+    vers = re.findall('href="PlayStream\.bundle-(\d+\.\d+\.\d+)\.zip"', r.content)
346
+    #vers.sort(reverse=True)
347
+    repo_version = vers[-1]
348
+    return repo_version
349
+
249
 def thumb_data(img, video=False):
350
 def thumb_data(img, video=False):
250
     default =  R(VIDEO) if video else R(FOLDER)
351
     default =  R(VIDEO) if video else R(FOLDER)
251
     if img.startswith('http'):
352
     if img.startswith('http'):
255
     else:
356
     else:
256
         img2 = R(img)
357
         img2 = R(img)
257
     return img2
358
     return img2
359
+

+ 1894
- 0
Contents/Code/project.wpr
File diff suppressed because it is too large
View File


+ 320
- 0
Contents/Code/wingdbstub.py View File

1
+#########################################################################
2
+""" wingdbstub.py    -- Debug stub for debuggifying Python programs
3
+
4
+Copyright (c) 1999-2001, Archaeopteryx Software, Inc.  All rights reserved.
5
+
6
+Written by Stephan R.A. Deibel and John P. Ehresman
7
+
8
+Usage:
9
+-----
10
+
11
+This is the file that Wing DB users copy into their python project 
12
+directory if they want to be able to debug programs that are launched
13
+outside of the IDE (e.g., CGI scripts, in response to a browser page
14
+load).
15
+
16
+To use this, edit the configuration values below to match your 
17
+Wing installation and requirements of your project.
18
+
19
+Then, add the following line to your code:
20
+
21
+  import wingdbstub
22
+
23
+Debugging will start immediately after this import statements.
24
+
25
+Next make sure that your IDE is running and that it's configured to accept
26
+connections from the host the debug program will be running on.
27
+
28
+Now, invoking your python file should run the code within the debugger.
29
+Note, however, that Wing will not stop in the code unless a breakpoint
30
+is set.
31
+
32
+If the debug process is started before the IDE, or is not listening
33
+at the time this module is imported then the program will run with
34
+debugging until an attach request is seen.  Attaching only works 
35
+if the .wingdebugpw file is present; see the manual for details.
36
+
37
+On win32, you either need to edit WINGHOME in this script or
38
+pass in an environment variable called WINGHOME that points to
39
+the Wing installation directory.
40
+
41
+"""
42
+#########################################################################
43
+
44
+import sys
45
+import os
46
+import imp
47
+
48
+
49
+#------------------------------------------------------------------------
50
+# Default configuration values:  Note that the named environment 
51
+# variables, if set, will override these settings.
52
+
53
+# Set this to 1 to disable all debugging; 0 to enable debugging
54
+# (WINGDB_DISABLED environment variable)
55
+kWingDebugDisabled = 0
56
+
57
+# Host:port of the IDE within which to debug: As configured in the IDE
58
+# with the Server Port preference
59
+# (WINGDB_HOSTPORT environment variable)
60
+kWingHostPort = 'localhost:50005'
61
+
62
+# Port on which to listen for connection requests, so that the
63
+# IDE can (re)attach to the debug process after it has started.
64
+# Set this to '-1' to disable listening for connection requests.
65
+# This is only used when the debug process is not attached to
66
+# an IDE or the IDE has dropped its connection. The configured
67
+# port can optionally be added to the IDE's Common Attach Hosts
68
+# preference. Note that a random port is used instead if this 
69
+# port is already in use!
70
+# (WINGDB_ATTACHPORT environment variable)
71
+kAttachPort = '50015'
72
+
73
+# Set this to a filename to log verbose information about the debugger
74
+# internals to a file.  If the file does not exist, it will be created
75
+# as long as its enclosing directory exists and is writeable.  Use 
76
+# "<stderr>" or "<stdout>".  Note that "<stderr>" may cause problems 
77
+# on win32 if the debug process is not running in a console.
78
+# (WINGDB_LOGFILE environment variable)
79
+kLogFile = None
80
+
81
+# Set to get a tremendous amount of logging from the debugger internals
82
+# (WINGDB_LOGVERYVERBOSE)
83
+kLogVeryVerbose = 0
84
+
85
+# Set this to 1 when debugging embedded scripts in an environment that
86
+# creates and reuses a Python instance across multiple script invocations:  
87
+# It turns off automatic detection of program quit so that the debug session
88
+# can span multiple script invocations.  When this is turned on, you may
89
+# need to call ProgramQuit() on the debugger object to shut down the
90
+# debugger cleanly when your application exits or discards the Python
91
+# instance.  If multiple Python instances are created in the same run,
92
+# only the first one will be able to debug unless it terminates debug
93
+# and the environment variable WINGDB_ACTIVE is unset before importing
94
+# this module in the second or later Python instance.  See the Wing
95
+# IDE manual for details.
96
+kEmbedded = 0
97
+
98
+# Path to search for the debug password file and the name of the file
99
+# to use.  The password file contains the encryption type and connect 
100
+# password for all connections to the IDE and must match the wingdebugpw
101
+# file in the profile dir used by the IDE.  Any entry of '$<winguserprofile>' 
102
+# is replaced by the wing user profile directory for the user that the 
103
+# current process is running as
104
+# (WINGDB_PWFILEPATH environment variable)
105
+kPWFilePath = [os.path.dirname(__file__), '$<winguserprofile>']
106
+kPWFileName = 'wingdebugpw'
107
+
108
+# Whether to exit if the debugger fails to run or to connect with an IDE
109
+# for whatever reason
110
+kExitOnFailure = 0
111
+
112
+#------------------------------------------------------------------------
113
+# Find Wing debugger installation location
114
+
115
+# Edit this to point to your Wing installation or set to None to use env WINGHOME
116
+# On OS X this must be set to name of the Wing application bundle
117
+# (for example, /Applications/WingIDE.app)
118
+WINGHOME = None
119
+
120
+if sys.hexversion >= 0x03000000:
121
+  def has_key(o, key):
122
+    return key in o
123
+else:
124
+  def has_key(o, key):
125
+    return o.has_key(key)
126
+    
127
+# Check environment:  Must have WINGHOME defined if still == None
128
+if WINGHOME == None:
129
+  if has_key(os.environ, 'WINGHOME'):
130
+    WINGHOME=os.environ['WINGHOME']
131
+  else:
132
+    sys.stdout.write("*******************************************************************\n")
133
+    sys.stdout.write("Error: Could not find Wing installation!  You must set WINGHOME or edit\n")
134
+    sys.stdout.write("wingdbstub.py where indicated to point it to the location where\n")
135
+    sys.stdout.write("Wing is installed.\n")
136
+    sys.exit(1)
137
+
138
+kPWFilePath.append(WINGHOME)
139
+
140
+# The user settings dir where per-user settings & patches are located.  Will be
141
+# set from environment if left as None
142
+kUserSettingsDir = None
143
+if kUserSettingsDir is None:
144
+  kUserSettingsDir = os.environ.get('WINGDB_USERSETTINGS')
145
+  
146
+def _FindActualWingHome(winghome):
147
+  """ Find the actual directory to use for winghome.  Needed on OS X
148
+  where the .app directory is the preferred dir to use for WINGHOME and
149
+  .app/Contents/MacOS is accepted for backward compatibility. """
150
+  
151
+  if sys.platform != 'darwin':
152
+    return winghome
153
+  
154
+  app_dir = None
155
+  if os.path.isdir(winghome):
156
+    if winghome.endswith('/'):
157
+      wo_slash = winghome[:-1]
158
+    else:
159
+      wo_slash = winghome
160
+      
161
+    if wo_slash.endswith('.app'):
162
+      app_dir = wo_slash
163
+    elif wo_slash.endswith('.app/Contents/MacOS'):
164
+      app_dir = wo_slash[:-len('/Contents/MacOS')]
165
+    
166
+  if app_dir and os.path.isdir(os.path.join(app_dir, 'Contents', 'Resources')):
167
+    return os.path.join(app_dir, 'Contents', 'Resources')
168
+  
169
+  return winghome
170
+  
171
+def _ImportWingdb(winghome, user_settings=None):
172
+  """ Find & import wingdb module. """
173
+  
174
+  try:
175
+    exec_dict = {}
176
+    execfile(os.path.join(winghome, 'bin', '_patchsupport.py'), exec_dict)
177
+    find_matching = exec_dict['FindMatching']
178
+    dir_list = find_matching('bin', winghome, user_settings)
179
+  except Exception:
180
+    dir_list = []
181
+  dir_list.extend([os.path.join(winghome, 'bin'), os.path.join(winghome, 'src')])
182
+  for path in dir_list:
183
+    try:
184
+      f, p, d = imp.find_module('wingdb', [path])
185
+      try:
186
+        return imp.load_module('wingdb', f, p, d)
187
+      finally:
188
+        if f is not None:
189
+          f.close()
190
+      break
191
+    except ImportError:
192
+      pass
193
+
194
+#------------------------------------------------------------------------
195
+# Set debugger if it hasn't been set -- this is to handle module reloading
196
+# In the reload case, the debugger variable will be set to something
197
+try:
198
+  debugger
199
+except NameError:
200
+  debugger = None
201
+  
202
+# Unset WINGDB_ACTIVE env if it was inherited from another process
203
+# XXX Would be better to be able to call getpid() on dbgtracer but can't access it yet
204
+if 'WINGDB_ACTIVE' in os.environ and os.environ['WINGDB_ACTIVE'] != str(os.getpid()):
205
+  del os.environ['WINGDB_ACTIVE']
206
+
207
+# Start debugging if not disabled and this module has never been imported
208
+# before
209
+if (not kWingDebugDisabled and debugger is None
210
+    and not has_key(os.environ, 'WINGDB_DISABLED') and 
211
+    not has_key(os.environ, 'WINGDB_ACTIVE')):
212
+
213
+  exit_on_fail = 0
214
+  
215
+  try:
216
+    # Obtain exit if fails value
217
+    exit_on_fail = os.environ.get('WINGDB_EXITONFAILURE', kExitOnFailure)
218
+    
219
+    # Obtain configuration for log file to use, if any
220
+    logfile = os.environ.get('WINGDB_LOGFILE', kLogFile)
221
+    if logfile == '-' or logfile == None or len(logfile.strip()) == 0:
222
+      logfile = None
223
+
224
+    very_verbose_log = os.environ.get('WINGDB_LOGVERYVERBOSE', kLogVeryVerbose)
225
+    if type(very_verbose_log) == type('') and very_verbose_log.strip() == '':
226
+      very_verbose_log = 0
227
+      
228
+    # Determine remote host/port where the IDE is running
229
+    hostport = os.environ.get('WINGDB_HOSTPORT', kWingHostPort)
230
+    colonpos = hostport.find(':')
231
+    host = hostport[:colonpos]
232
+    port = int(hostport[colonpos+1:])
233
+  
234
+    # Determine port to listen on locally for attach requests
235
+    attachport = int(os.environ.get('WINGDB_ATTACHPORT', kAttachPort))
236
+  
237
+    # Check if running embedded script
238
+    embedded = int(os.environ.get('WINGDB_EMBEDDED', kEmbedded))
239
+  
240
+    # Obtain debug password file search path
241
+    if has_key(os.environ, 'WINGDB_PWFILEPATH'):
242
+      pwfile_path = os.environ['WINGDB_PWFILEPATH'].split(os.pathsep)
243
+    else:
244
+      pwfile_path = kPWFilePath
245
+    
246
+    # Obtain debug password file name
247
+    if has_key(os.environ, 'WINGDB_PWFILENAME'):
248
+      pwfile_name = os.environ['WINGDB_PWFILENAME']
249
+    else:
250
+      pwfile_name = kPWFileName
251
+    
252
+    # Load wingdb.py
253
+    actual_winghome = _FindActualWingHome(WINGHOME)
254
+    wingdb = _ImportWingdb(actual_winghome, kUserSettingsDir)
255
+    if wingdb == None:
256
+      sys.stdout.write("*******************************************************************\n")
257
+      sys.stdout.write("Error: Cannot find wingdb.py in $(WINGHOME)/bin or $(WINGHOME)/src\n")
258
+      sys.stdout.write("Error: Please check the WINGHOME definition in wingdbstub.py\n")
259
+      sys.exit(2)
260
+    
261
+    # Find the netserver module and create an error stream
262
+    netserver = wingdb.FindNetServerModule(actual_winghome, kUserSettingsDir)
263
+    err = wingdb.CreateErrStream(netserver, logfile, very_verbose_log)
264
+    
265
+    # Start debugging
266
+    debugger = netserver.CNetworkServer(host, port, attachport, err, 
267
+                                        pwfile_path=pwfile_path,
268
+                                        pwfile_name=pwfile_name,
269
+                                        autoquit=not embedded)
270
+    debugger.StartDebug(stophere=0)
271
+    os.environ['WINGDB_ACTIVE'] = str(os.getpid())
272
+    if debugger.ChannelClosed():
273
+      raise ValueError('Not connected')
274
+    
275
+  except:
276
+    if exit_on_fail:
277
+      raise
278
+    else:
279
+      pass
280
+
281
+def Ensure(require_connection=1, require_debugger=1):
282
+  """ Ensure the debugger is started and attempt to connect to the IDE if
283
+  not already connected.  Will raise a ValueError if:
284
+  
285
+  * the require_connection arg is true and the debugger is unable to connect
286
+  * the require_debugger arg is true and the debugger cannot be loaded
287
+  
288
+  If SuspendDebug() has been called through the low-level API, calling
289
+  Ensure() resets the suspend count to zero and additional calls to
290
+  ResumeDebug() will be ignored until SuspendDebug() is called again.
291
+  
292
+  Note that a change to the host & port to connect to will only
293
+  be use if a new connection is made.
294
+  
295
+  """
296
+  
297
+  if debugger is None:
298
+    if require_debugger:
299
+      raise ValueError("No debugger")
300
+    return
301
+
302
+  hostport = os.environ.get('WINGDB_HOSTPORT', kWingHostPort)
303
+  colonpos = hostport.find(':')
304
+  host = hostport[:colonpos]
305
+  port = int(hostport[colonpos+1:])
306
+  
307
+  resumed = debugger.ResumeDebug()
308
+  while resumed > 0:
309
+    resumed = debugger.ResumeDebug()
310
+  
311
+  debugger.SetClientAddress((host, port))  
312
+  
313
+  if not debugger.DebugActive():
314
+    debugger.StartDebug()
315
+  elif debugger.ChannelClosed():
316
+    debugger.ConnectToClient()
317
+    
318
+  if require_connection and debugger.ChannelClosed():
319
+    raise ValueError('Not connected')
320
+    

+ 8
- 1
Contents/DefaultPrefs.json View File

1
 [
1
 [
2
+    { "id": "general_use_streams_file_remote", "label": "General: Use remote content config file", "type": "bool", "default": "false" },
3
+    { "id": "general_streams_file", "label": "General: Local content config file location/name", "type": "text", "default": "streams.cfg" },
4
+    { "id": "general_streams_file_remote", "label": "General: Remote content config file location/name", "type": "text", "default": "ftp://user:password@host/hdd/streams.cfg" },
2
     { "id": "general_proxy", "label": "General: Launch stream proxy", "type": "bool", "default": "false" },
5
     { "id": "general_proxy", "label": "General: Launch stream proxy", "type": "bool", "default": "false" },
3
     { "id": "general_port", "label": "General: Proxy port", "type": "number", "default": "8880" },
6
     { "id": "general_port", "label": "General: Proxy port", "type": "number", "default": "8880" },
4
     { "id": "general_proxy_url", "label": "General: Proxy URL", "type": "text", "default": "http://localhost:8880/" },
7
     { "id": "general_proxy_url", "label": "General: Proxy URL", "type": "text", "default": "http://localhost:8880/" },
20
     { "id": "euronews_language", "label": "Euronews: Language", "type": "text", "default": "en" },
23
     { "id": "euronews_language", "label": "Euronews: Language", "type": "text", "default": "en" },
21
 
24
 
22
     { "id": "ustvnow_user", "label": "USTVNow: User", "type": "text", "default": "change user" },
25
     { "id": "ustvnow_user", "label": "USTVNow: User", "type": "text", "default": "change user" },
23
-    { "id": "ustvnow_password", "label": "USTVNow: Password", "type": "text", "default": "change password" }
26
+    { "id": "ustvnow_password", "label": "USTVNow: Password", "type": "text", "default": "change password" },
27
+
28
+    { "id": "enigma2_host", "label": "Enigma2: Receiver hostname or ip addressr", "type": "text", "default": "localhost" },
29
+    { "id": "enigma2_user", "label": "Enigma2: User", "type": "text", "default": "" },
30
+    { "id": "enigma2_password", "label": "Enigma2: Password", "type": "text", "default": "" }
24
 ]
31
 ]

+ 0
- 0
Contents/Libraries/Shared/__init__.py View File


+ 86
- 0
Contents/Libraries/Shared/requests/__init__.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+#   __
4
+#  /__)  _  _     _   _ _/   _
5
+# / (   (- (/ (/ (- _)  /  _)
6
+#          /
7
+
8
+"""
9
+Requests HTTP library
10
+~~~~~~~~~~~~~~~~~~~~~
11
+
12
+Requests is an HTTP library, written in Python, for human beings. Basic GET
13
+usage:
14
+
15
+   >>> import requests
16
+   >>> r = requests.get('https://www.python.org')
17
+   >>> r.status_code
18
+   200
19
+   >>> 'Python is a programming language' in r.content
20
+   True
21
+
22
+... or POST:
23
+
24
+   >>> payload = dict(key1='value1', key2='value2')
25
+   >>> r = requests.post('http://httpbin.org/post', data=payload)
26
+   >>> print(r.text)
27
+   {
28
+     ...
29
+     "form": {
30
+       "key2": "value2",
31
+       "key1": "value1"
32
+     },
33
+     ...
34
+   }
35
+
36
+The other HTTP methods are supported - see `requests.api`. Full documentation
37
+is at <http://python-requests.org>.
38
+
39
+:copyright: (c) 2016 by Kenneth Reitz.
40
+:license: Apache 2.0, see LICENSE for more details.
41
+"""
42
+
43
+__title__ = 'requests'
44
+__version__ = '2.11.1'
45
+__build__ = 0x021101
46
+__author__ = 'Kenneth Reitz'
47
+__license__ = 'Apache 2.0'
48
+__copyright__ = 'Copyright 2016 Kenneth Reitz'
49
+
50
+# Attempt to enable urllib3's SNI support, if possible
51
+try:
52
+    from .packages.urllib3.contrib import pyopenssl
53
+    pyopenssl.inject_into_urllib3()
54
+except ImportError:
55
+    pass
56
+
57
+import warnings
58
+
59
+# urllib3's DependencyWarnings should be silenced.
60
+from .packages.urllib3.exceptions import DependencyWarning
61
+warnings.simplefilter('ignore', DependencyWarning)
62
+
63
+from . import utils
64
+from .models import Request, Response, PreparedRequest
65
+from .api import request, get, head, post, patch, put, delete, options
66
+from .sessions import session, Session
67
+from .status_codes import codes
68
+from .exceptions import (
69
+    RequestException, Timeout, URLRequired,
70
+    TooManyRedirects, HTTPError, ConnectionError,
71
+    FileModeWarning, ConnectTimeout, ReadTimeout
72
+)
73
+
74
+# Set default logging handler to avoid "No handler found" warnings.
75
+import logging
76
+try:  # Python 2.7+
77
+    from logging import NullHandler
78
+except ImportError:
79
+    class NullHandler(logging.Handler):
80
+        def emit(self, record):
81
+            pass
82
+
83
+logging.getLogger(__name__).addHandler(NullHandler())
84
+
85
+# FileModeWarnings go off per the default.
86
+warnings.simplefilter('default', FileModeWarning, append=True)

+ 42
- 0
Contents/Libraries/Shared/requests/_internal_utils.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+requests._internal_utils
5
+~~~~~~~~~~~~~~
6
+
7
+Provides utility functions that are consumed internally by Requests
8
+which depend on extremely few external helpers (such as compat)
9
+"""
10
+
11
+from .compat import is_py2, builtin_str, str
12
+
13
+
14
+def to_native_string(string, encoding='ascii'):
15
+    """Given a string object, regardless of type, returns a representation of
16
+    that string in the native string type, encoding and decoding where
17
+    necessary. This assumes ASCII unless told otherwise.
18
+    """
19
+    if isinstance(string, builtin_str):
20
+        out = string
21
+    else:
22
+        if is_py2:
23
+            out = string.encode(encoding)
24
+        else:
25
+            out = string.decode(encoding)
26
+
27
+    return out
28
+
29
+
30
+def unicode_is_ascii(u_string):
31
+    """Determine if unicode string only contains ASCII characters.
32
+
33
+    :param str u_string: unicode string to check. Must be unicode
34
+        and not Python 2 `str`.
35
+    :rtype: bool
36
+    """
37
+    assert isinstance(u_string, str)
38
+    try:
39
+        u_string.encode('ascii')
40
+        return True
41
+    except UnicodeEncodeError:
42
+        return False

+ 503
- 0
Contents/Libraries/Shared/requests/adapters.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+requests.adapters
5
+~~~~~~~~~~~~~~~~~
6
+
7
+This module contains the transport adapters that Requests uses to define
8
+and maintain connections.
9
+"""
10
+
11
+import os.path
12
+import socket
13
+
14
+from .models import Response
15
+from .packages.urllib3.poolmanager import PoolManager, proxy_from_url
16
+from .packages.urllib3.response import HTTPResponse
17
+from .packages.urllib3.util import Timeout as TimeoutSauce
18
+from .packages.urllib3.util.retry import Retry
19
+from .compat import urlparse, basestring
20
+from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers,
21
+                    prepend_scheme_if_needed, get_auth_from_url, urldefragauth,
22
+                    select_proxy, to_native_string)
23
+from .structures import CaseInsensitiveDict
24
+from .packages.urllib3.exceptions import ClosedPoolError
25
+from .packages.urllib3.exceptions import ConnectTimeoutError
26
+from .packages.urllib3.exceptions import HTTPError as _HTTPError
27
+from .packages.urllib3.exceptions import MaxRetryError
28
+from .packages.urllib3.exceptions import NewConnectionError
29
+from .packages.urllib3.exceptions import ProxyError as _ProxyError
30
+from .packages.urllib3.exceptions import ProtocolError
31
+from .packages.urllib3.exceptions import ReadTimeoutError
32
+from .packages.urllib3.exceptions import SSLError as _SSLError
33
+from .packages.urllib3.exceptions import ResponseError
34
+from .cookies import extract_cookies_to_jar
35
+from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError,
36
+                         ProxyError, RetryError, InvalidSchema)
37
+from .auth import _basic_auth_str
38
+
39
+try:
40
+    from .packages.urllib3.contrib.socks import SOCKSProxyManager
41
+except ImportError:
42
+    def SOCKSProxyManager(*args, **kwargs):
43
+        raise InvalidSchema("Missing dependencies for SOCKS support.")
44
+
45
+DEFAULT_POOLBLOCK = False
46
+DEFAULT_POOLSIZE = 10
47
+DEFAULT_RETRIES = 0
48
+DEFAULT_POOL_TIMEOUT = None
49
+
50
+
51
+class BaseAdapter(object):
52
+    """The Base Transport Adapter"""
53
+
54
+    def __init__(self):
55
+        super(BaseAdapter, self).__init__()
56
+
57
+    def send(self, request, stream=False, timeout=None, verify=True,
58
+             cert=None, proxies=None):
59
+        """Sends PreparedRequest object. Returns Response object.
60
+
61
+        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
62
+        :param stream: (optional) Whether to stream the request content.
63
+        :param timeout: (optional) How long to wait for the server to send
64
+            data before giving up, as a float, or a :ref:`(connect timeout,
65
+            read timeout) <timeouts>` tuple.
66
+        :type timeout: float or tuple
67
+        :param verify: (optional) Whether to verify SSL certificates.
68
+        :param cert: (optional) Any user-provided SSL certificate to be trusted.
69
+        :param proxies: (optional) The proxies dictionary to apply to the request.
70
+        """
71
+        raise NotImplementedError
72
+
73
+    def close(self):
74
+        """Cleans up adapter specific items."""
75
+        raise NotImplementedError
76
+
77
+
78
+class HTTPAdapter(BaseAdapter):
79
+    """The built-in HTTP Adapter for urllib3.
80
+
81
+    Provides a general-case interface for Requests sessions to contact HTTP and
82
+    HTTPS urls by implementing the Transport Adapter interface. This class will
83
+    usually be created by the :class:`Session <Session>` class under the
84
+    covers.
85
+
86
+    :param pool_connections: The number of urllib3 connection pools to cache.
87
+    :param pool_maxsize: The maximum number of connections to save in the pool.
88
+    :param max_retries: The maximum number of retries each connection
89
+        should attempt. Note, this applies only to failed DNS lookups, socket
90
+        connections and connection timeouts, never to requests where data has
91
+        made it to the server. By default, Requests does not retry failed
92
+        connections. If you need granular control over the conditions under
93
+        which we retry a request, import urllib3's ``Retry`` class and pass
94
+        that instead.
95
+    :param pool_block: Whether the connection pool should block for connections.
96
+
97
+    Usage::
98
+
99
+      >>> import requests
100
+      >>> s = requests.Session()
101
+      >>> a = requests.adapters.HTTPAdapter(max_retries=3)
102
+      >>> s.mount('http://', a)
103
+    """
104
+    __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize',
105
+                 '_pool_block']
106
+
107
+    def __init__(self, pool_connections=DEFAULT_POOLSIZE,
108
+                 pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES,
109
+                 pool_block=DEFAULT_POOLBLOCK):
110
+        if max_retries == DEFAULT_RETRIES:
111
+            self.max_retries = Retry(0, read=False)
112
+        else:
113
+            self.max_retries = Retry.from_int(max_retries)
114
+        self.config = {}
115
+        self.proxy_manager = {}
116
+
117
+        super(HTTPAdapter, self).__init__()
118
+
119
+        self._pool_connections = pool_connections
120
+        self._pool_maxsize = pool_maxsize
121
+        self._pool_block = pool_block
122
+
123
+        self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block)
124
+
125
+    def __getstate__(self):
126
+        return dict((attr, getattr(self, attr, None)) for attr in
127
+                    self.__attrs__)
128
+
129
+    def __setstate__(self, state):
130
+        # Can't handle by adding 'proxy_manager' to self.__attrs__ because
131
+        # self.poolmanager uses a lambda function, which isn't pickleable.
132
+        self.proxy_manager = {}
133
+        self.config = {}
134
+
135
+        for attr, value in state.items():
136
+            setattr(self, attr, value)
137
+
138
+        self.init_poolmanager(self._pool_connections, self._pool_maxsize,
139
+                              block=self._pool_block)
140
+
141
+    def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs):
142
+        """Initializes a urllib3 PoolManager.
143
+
144
+        This method should not be called from user code, and is only
145
+        exposed for use when subclassing the
146
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
147
+
148
+        :param connections: The number of urllib3 connection pools to cache.
149
+        :param maxsize: The maximum number of connections to save in the pool.
150
+        :param block: Block when no free connections are available.
151
+        :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager.
152
+        """
153
+        # save these values for pickling
154
+        self._pool_connections = connections
155
+        self._pool_maxsize = maxsize
156
+        self._pool_block = block
157
+
158
+        self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize,
159
+                                       block=block, strict=True, **pool_kwargs)
160
+
161
+    def proxy_manager_for(self, proxy, **proxy_kwargs):
162
+        """Return urllib3 ProxyManager for the given proxy.
163
+
164
+        This method should not be called from user code, and is only
165
+        exposed for use when subclassing the
166
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
167
+
168
+        :param proxy: The proxy to return a urllib3 ProxyManager for.
169
+        :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager.
170
+        :returns: ProxyManager
171
+        :rtype: requests.packages.urllib3.ProxyManager
172
+        """
173
+        if proxy in self.proxy_manager:
174
+            manager = self.proxy_manager[proxy]
175
+        elif proxy.lower().startswith('socks'):
176
+            username, password = get_auth_from_url(proxy)
177
+            manager = self.proxy_manager[proxy] = SOCKSProxyManager(
178
+                proxy,
179
+                username=username,
180
+                password=password,
181
+                num_pools=self._pool_connections,
182
+                maxsize=self._pool_maxsize,
183
+                block=self._pool_block,
184
+                **proxy_kwargs
185
+            )
186
+        else:
187
+            proxy_headers = self.proxy_headers(proxy)
188
+            manager = self.proxy_manager[proxy] = proxy_from_url(
189
+                proxy,
190
+                proxy_headers=proxy_headers,
191
+                num_pools=self._pool_connections,
192
+                maxsize=self._pool_maxsize,
193
+                block=self._pool_block,
194
+                **proxy_kwargs)
195
+
196
+        return manager
197
+
198
+    def cert_verify(self, conn, url, verify, cert):
199
+        """Verify a SSL certificate. This method should not be called from user
200
+        code, and is only exposed for use when subclassing the
201
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
202
+
203
+        :param conn: The urllib3 connection object associated with the cert.
204
+        :param url: The requested URL.
205
+        :param verify: Whether we should actually verify the certificate.
206
+        :param cert: The SSL certificate to verify.
207
+        """
208
+        if url.lower().startswith('https') and verify:
209
+
210
+            cert_loc = None
211
+
212
+            # Allow self-specified cert location.
213
+            if verify is not True:
214
+                cert_loc = verify
215
+
216
+            if not cert_loc:
217
+                cert_loc = DEFAULT_CA_BUNDLE_PATH
218
+
219
+            if not cert_loc:
220
+                raise Exception("Could not find a suitable SSL CA certificate bundle.")
221
+
222
+            conn.cert_reqs = 'CERT_REQUIRED'
223
+
224
+            if not os.path.isdir(cert_loc):
225
+                conn.ca_certs = cert_loc
226
+            else:
227
+                conn.ca_cert_dir = cert_loc
228
+        else:
229
+            conn.cert_reqs = 'CERT_NONE'
230
+            conn.ca_certs = None
231
+            conn.ca_cert_dir = None
232
+
233
+        if cert:
234
+            if not isinstance(cert, basestring):
235
+                conn.cert_file = cert[0]
236
+                conn.key_file = cert[1]
237
+            else:
238
+                conn.cert_file = cert
239
+
240
+    def build_response(self, req, resp):
241
+        """Builds a :class:`Response <requests.Response>` object from a urllib3
242
+        response. This should not be called from user code, and is only exposed
243
+        for use when subclassing the
244
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`
245
+
246
+        :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response.
247
+        :param resp: The urllib3 response object.
248
+        :rtype: requests.Response
249
+        """
250
+        response = Response()
251
+
252
+        # Fallback to None if there's no status_code, for whatever reason.
253
+        response.status_code = getattr(resp, 'status', None)
254
+
255
+        # Make headers case-insensitive.
256
+        response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {}))
257
+
258
+        # Set encoding.
259
+        response.encoding = get_encoding_from_headers(response.headers)
260
+        response.raw = resp
261
+        response.reason = response.raw.reason
262
+
263
+        if isinstance(req.url, bytes):
264
+            response.url = req.url.decode('utf-8')
265
+        else:
266
+            response.url = req.url
267
+
268
+        # Add new cookies from the server.
269
+        extract_cookies_to_jar(response.cookies, req, resp)
270
+
271
+        # Give the Response some context.
272
+        response.request = req
273
+        response.connection = self
274
+
275
+        return response
276
+
277
+    def get_connection(self, url, proxies=None):
278
+        """Returns a urllib3 connection for the given URL. This should not be
279
+        called from user code, and is only exposed for use when subclassing the
280
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
281
+
282
+        :param url: The URL to connect to.
283
+        :param proxies: (optional) A Requests-style dictionary of proxies used on this request.
284
+        :rtype: requests.packages.urllib3.ConnectionPool
285
+        """
286
+        proxy = select_proxy(url, proxies)
287
+
288
+        if proxy:
289
+            proxy = prepend_scheme_if_needed(proxy, 'http')
290
+            proxy_manager = self.proxy_manager_for(proxy)
291
+            conn = proxy_manager.connection_from_url(url)
292
+        else:
293
+            # Only scheme should be lower case
294
+            parsed = urlparse(url)
295
+            url = parsed.geturl()
296
+            conn = self.poolmanager.connection_from_url(url)
297
+
298
+        return conn
299
+
300
+    def close(self):
301
+        """Disposes of any internal state.
302
+
303
+        Currently, this closes the PoolManager and any active ProxyManager,
304
+        which closes any pooled connections.
305
+        """
306
+        self.poolmanager.clear()
307
+        for proxy in self.proxy_manager.values():
308
+            proxy.clear()
309
+
310
+    def request_url(self, request, proxies):
311
+        """Obtain the url to use when making the final request.
312
+
313
+        If the message is being sent through a HTTP proxy, the full URL has to
314
+        be used. Otherwise, we should only use the path portion of the URL.
315
+
316
+        This should not be called from user code, and is only exposed for use
317
+        when subclassing the
318
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
319
+
320
+        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
321
+        :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs.
322
+        :rtype: str
323
+        """
324
+        proxy = select_proxy(request.url, proxies)
325
+        scheme = urlparse(request.url).scheme
326
+
327
+        is_proxied_http_request = (proxy and scheme != 'https')
328
+        using_socks_proxy = False
329
+        if proxy:
330
+            proxy_scheme = urlparse(proxy).scheme.lower()
331
+            using_socks_proxy = proxy_scheme.startswith('socks')
332
+
333
+        url = request.path_url
334
+        if is_proxied_http_request and not using_socks_proxy:
335
+            url = urldefragauth(request.url)
336
+
337
+        return url
338
+
339
+    def add_headers(self, request, **kwargs):
340
+        """Add any headers needed by the connection. As of v2.0 this does
341
+        nothing by default, but is left for overriding by users that subclass
342
+        the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
343
+
344
+        This should not be called from user code, and is only exposed for use
345
+        when subclassing the
346
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
347
+
348
+        :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to.
349
+        :param kwargs: The keyword arguments from the call to send().
350
+        """
351
+        pass
352
+
353
+    def proxy_headers(self, proxy):
354
+        """Returns a dictionary of the headers to add to any request sent
355
+        through a proxy. This works with urllib3 magic to ensure that they are
356
+        correctly sent to the proxy, rather than in a tunnelled request if
357
+        CONNECT is being used.
358
+
359
+        This should not be called from user code, and is only exposed for use
360
+        when subclassing the
361
+        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
362
+
363
+        :param proxies: The url of the proxy being used for this request.
364
+        :rtype: dict
365
+        """
366
+        headers = {}
367
+        username, password = get_auth_from_url(proxy)
368
+
369
+        if username and password:
370
+            headers['Proxy-Authorization'] = _basic_auth_str(username,
371
+                                                             password)
372
+
373
+        return headers
374
+
375
+    def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):
376
+        """Sends PreparedRequest object. Returns Response object.
377
+
378
+        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
379
+        :param stream: (optional) Whether to stream the request content.
380
+        :param timeout: (optional) How long to wait for the server to send
381
+            data before giving up, as a float, or a :ref:`(connect timeout,
382
+            read timeout) <timeouts>` tuple.
383
+        :type timeout: float or tuple
384
+        :param verify: (optional) Whether to verify SSL certificates.
385
+        :param cert: (optional) Any user-provided SSL certificate to be trusted.
386
+        :param proxies: (optional) The proxies dictionary to apply to the request.
387
+        :rtype: requests.Response
388
+        """
389
+
390
+        conn = self.get_connection(request.url, proxies)
391
+
392
+        self.cert_verify(conn, request.url, verify, cert)
393
+        url = self.request_url(request, proxies)
394
+        self.add_headers(request)
395
+
396
+        chunked = not (request.body is None or 'Content-Length' in request.headers)
397
+
398
+        if isinstance(timeout, tuple):
399
+            try:
400
+                connect, read = timeout
401
+                timeout = TimeoutSauce(connect=connect, read=read)
402
+            except ValueError as e:
403
+                # this may raise a string formatting error.
404
+                err = ("Invalid timeout {0}. Pass a (connect, read) "
405
+                       "timeout tuple, or a single float to set "
406
+                       "both timeouts to the same value".format(timeout))
407
+                raise ValueError(err)
408
+        else:
409
+            timeout = TimeoutSauce(connect=timeout, read=timeout)
410
+
411
+        try:
412
+            if not chunked:
413
+                resp = conn.urlopen(
414
+                    method=request.method,
415
+                    url=url,
416
+                    body=request.body,
417
+                    headers=request.headers,
418
+                    redirect=False,
419
+                    assert_same_host=False,
420
+                    preload_content=False,
421
+                    decode_content=False,
422
+                    retries=self.max_retries,
423
+                    timeout=timeout
424
+                )
425
+
426
+            # Send the request.
427
+            else:
428
+                if hasattr(conn, 'proxy_pool'):
429
+                    conn = conn.proxy_pool
430
+
431
+                low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT)
432
+
433
+                try:
434
+                    low_conn.putrequest(request.method,
435
+                                        url,
436
+                                        skip_accept_encoding=True)
437
+
438
+                    for header, value in request.headers.items():
439
+                        low_conn.putheader(header, value)
440
+
441
+                    low_conn.endheaders()
442
+
443
+                    for i in request.body:
444
+                        low_conn.send(hex(len(i))[2:].encode('utf-8'))
445
+                        low_conn.send(b'\r\n')
446
+                        low_conn.send(i)
447
+                        low_conn.send(b'\r\n')
448
+                    low_conn.send(b'0\r\n\r\n')
449
+
450
+                    # Receive the response from the server
451
+                    try:
452
+                        # For Python 2.7+ versions, use buffering of HTTP
453
+                        # responses
454
+                        r = low_conn.getresponse(buffering=True)
455
+                    except TypeError:
456
+                        # For compatibility with Python 2.6 versions and back
457
+                        r = low_conn.getresponse()
458
+
459
+                    resp = HTTPResponse.from_httplib(
460
+                        r,
461
+                        pool=conn,
462
+                        connection=low_conn,
463
+                        preload_content=False,
464
+                        decode_content=False
465
+                    )
466
+                except:
467
+                    # If we hit any problems here, clean up the connection.
468
+                    # Then, reraise so that we can handle the actual exception.
469
+                    low_conn.close()
470
+                    raise
471
+
472
+        except (ProtocolError, socket.error) as err:
473
+            raise ConnectionError(err, request=request)
474
+
475
+        except MaxRetryError as e:
476
+            if isinstance(e.reason, ConnectTimeoutError):
477
+                # TODO: Remove this in 3.0.0: see #2811
478
+                if not isinstance(e.reason, NewConnectionError):
479
+                    raise ConnectTimeout(e, request=request)
480
+
481
+            if isinstance(e.reason, ResponseError):
482
+                raise RetryError(e, request=request)
483
+
484
+            if isinstance(e.reason, _ProxyError):
485
+                raise ProxyError(e, request=request)
486
+
487
+            raise ConnectionError(e, request=request)
488
+
489
+        except ClosedPoolError as e:
490
+            raise ConnectionError(e, request=request)
491
+
492
+        except _ProxyError as e:
493
+            raise ProxyError(e)
494
+
495
+        except (_SSLError, _HTTPError) as e:
496
+            if isinstance(e, _SSLError):
497
+                raise SSLError(e, request=request)
498
+            elif isinstance(e, ReadTimeoutError):
499
+                raise ReadTimeout(e, request=request)
500
+            else:
501
+                raise
502
+
503
+        return self.build_response(request, resp)

+ 148
- 0
Contents/Libraries/Shared/requests/api.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+requests.api
5
+~~~~~~~~~~~~
6
+
7
+This module implements the Requests API.
8
+
9
+:copyright: (c) 2012 by Kenneth Reitz.
10
+:license: Apache2, see LICENSE for more details.
11
+"""
12
+
13
+from . import sessions
14
+
15
+
16
+def request(method, url, **kwargs):
17
+    """Constructs and sends a :class:`Request <Request>`.
18
+
19
+    :param method: method for the new :class:`Request` object.
20
+    :param url: URL for the new :class:`Request` object.
21
+    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
22
+    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
23
+    :param json: (optional) json data to send in the body of the :class:`Request`.
24
+    :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
25
+    :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
26
+    :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.
27
+        ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``
28
+        or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string
29
+        defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers
30
+        to add for the file.
31
+    :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
32
+    :param timeout: (optional) How long to wait for the server to send data
33
+        before giving up, as a float, or a :ref:`(connect timeout, read
34
+        timeout) <timeouts>` tuple.
35
+    :type timeout: float or tuple
36
+    :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed.
37
+    :type allow_redirects: bool
38
+    :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
39
+    :param verify: (optional) whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to ``True``.
40
+    :param stream: (optional) if ``False``, the response content will be immediately downloaded.
41
+    :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
42
+    :return: :class:`Response <Response>` object
43
+    :rtype: requests.Response
44
+
45
+    Usage::
46
+
47
+      >>> import requests
48
+      >>> req = requests.request('GET', 'http://httpbin.org/get')
49
+      <Response [200]>
50
+    """
51
+
52
+    # By using the 'with' statement we are sure the session is closed, thus we
53
+    # avoid leaving sockets open which can trigger a ResourceWarning in some
54
+    # cases, and look like a memory leak in others.
55
+    with sessions.Session() as session:
56
+        return session.request(method=method, url=url, **kwargs)
57
+
58
+
59
+def get(url, params=None, **kwargs):
60
+    """Sends a GET request.
61
+
62
+    :param url: URL for the new :class:`Request` object.
63
+    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
64
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
65
+    :return: :class:`Response <Response>` object
66
+    :rtype: requests.Response
67
+    """
68
+
69
+    kwargs.setdefault('allow_redirects', True)
70
+    return request('get', url, params=params, **kwargs)
71
+
72
+
73
+def options(url, **kwargs):
74
+    """Sends a OPTIONS request.
75
+
76
+    :param url: URL for the new :class:`Request` object.
77
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
78
+    :return: :class:`Response <Response>` object
79
+    :rtype: requests.Response
80
+    """
81
+
82
+    kwargs.setdefault('allow_redirects', True)
83
+    return request('options', url, **kwargs)
84
+
85
+
86
+def head(url, **kwargs):
87
+    """Sends a HEAD request.
88
+
89
+    :param url: URL for the new :class:`Request` object.
90
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
91
+    :return: :class:`Response <Response>` object
92
+    :rtype: requests.Response
93
+    """
94
+
95
+    kwargs.setdefault('allow_redirects', False)
96
+    return request('head', url, **kwargs)
97
+
98
+
99
+def post(url, data=None, json=None, **kwargs):
100
+    """Sends a POST request.
101
+
102
+    :param url: URL for the new :class:`Request` object.
103
+    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
104
+    :param json: (optional) json data to send in the body of the :class:`Request`.
105
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
106
+    :return: :class:`Response <Response>` object
107
+    :rtype: requests.Response
108
+    """
109
+
110
+    return request('post', url, data=data, json=json, **kwargs)
111
+
112
+
113
+def put(url, data=None, **kwargs):
114
+    """Sends a PUT request.
115
+
116
+    :param url: URL for the new :class:`Request` object.
117
+    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
118
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
119
+    :return: :class:`Response <Response>` object
120
+    :rtype: requests.Response
121
+    """
122
+
123
+    return request('put', url, data=data, **kwargs)
124
+
125
+
126
+def patch(url, data=None, **kwargs):
127
+    """Sends a PATCH request.
128
+
129
+    :param url: URL for the new :class:`Request` object.
130
+    :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
131
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
132
+    :return: :class:`Response <Response>` object
133
+    :rtype: requests.Response
134
+    """
135
+
136
+    return request('patch', url,  data=data, **kwargs)
137
+
138
+
139
+def delete(url, **kwargs):
140
+    """Sends a DELETE request.
141
+
142
+    :param url: URL for the new :class:`Request` object.
143
+    :param \*\*kwargs: Optional arguments that ``request`` takes.
144
+    :return: :class:`Response <Response>` object
145
+    :rtype: requests.Response
146
+    """
147
+
148
+    return request('delete', url, **kwargs)

+ 252
- 0
Contents/Libraries/Shared/requests/auth.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+requests.auth
5
+~~~~~~~~~~~~~
6
+
7
+This module contains the authentication handlers for Requests.
8
+"""
9
+
10
+import os
11
+import re
12
+import time
13
+import hashlib
14
+import threading
15
+
16
+from base64 import b64encode
17
+
18
+from .compat import urlparse, str
19
+from .cookies import extract_cookies_to_jar
20
+from .utils import parse_dict_header, to_native_string
21
+from .status_codes import codes
22
+
23
+CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded'
24
+CONTENT_TYPE_MULTI_PART = 'multipart/form-data'
25
+
26
+
27
+def _basic_auth_str(username, password):
28
+    """Returns a Basic Auth string."""
29
+
30
+    authstr = 'Basic ' + to_native_string(
31
+        b64encode(('%s:%s' % (username, password)).encode('latin1')).strip()
32
+    )
33
+
34
+    return authstr
35
+
36
+
37
+class AuthBase(object):
38
+    """Base class that all auth implementations derive from"""
39
+
40
+    def __call__(self, r):
41
+        raise NotImplementedError('Auth hooks must be callable.')
42
+
43
+
44
+class HTTPBasicAuth(AuthBase):
45
+    """Attaches HTTP Basic Authentication to the given Request object."""
46
+
47
+    def __init__(self, username, password):
48
+        self.username = username
49
+        self.password = password
50
+
51
+    def __eq__(self, other):
52
+        return all([
53
+            self.username == getattr(other, 'username', None),
54
+            self.password == getattr(other, 'password', None)
55
+        ])
56
+
57
+    def __ne__(self, other):
58
+        return not self == other
59
+
60
+    def __call__(self, r):
61
+        r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
62
+        return r
63
+
64
+
65
+class HTTPProxyAuth(HTTPBasicAuth):
66
+    """Attaches HTTP Proxy Authentication to a given Request object."""
67
+
68
+    def __call__(self, r):
69
+        r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password)
70
+        return r
71
+
72
+
73
+class HTTPDigestAuth(AuthBase):
74
+    """Attaches HTTP Digest Authentication to the given Request object."""
75
+
76
+    def __init__(self, username, password):
77
+        self.username = username
78
+        self.password = password
79
+        # Keep state in per-thread local storage
80
+        self._thread_local = threading.local()
81
+
82
+    def init_per_thread_state(self):
83
+        # Ensure state is initialized just once per-thread
84
+        if not hasattr(self._thread_local, 'init'):
85
+            self._thread_local.init = True
86
+            self._thread_local.last_nonce = ''
87
+            self._thread_local.nonce_count = 0
88
+            self._thread_local.chal = {}
89
+            self._thread_local.pos = None
90
+            self._thread_local.num_401_calls = None
91
+
92
+    def build_digest_header(self, method, url):
93
+        """
94
+        :rtype: str
95
+        """
96
+
97
+        realm = self._thread_local.chal['realm']
98
+        nonce = self._thread_local.chal['nonce']
99
+        qop = self._thread_local.chal.get('qop')
100
+        algorithm = self._thread_local.chal.get('algorithm')
101
+        opaque = self._thread_local.chal.get('opaque')
102
+        hash_utf8 = None
103
+
104
+        if algorithm is None:
105
+            _algorithm = 'MD5'
106
+        else:
107
+            _algorithm = algorithm.upper()
108
+        # lambdas assume digest modules are imported at the top level
109
+        if _algorithm == 'MD5' or _algorithm == 'MD5-SESS':
110
+            def md5_utf8(x):
111
+                if isinstance(x, str):
112
+                    x = x.encode('utf-8')
113
+                return hashlib.md5(x).hexdigest()
114
+            hash_utf8 = md5_utf8
115
+        elif _algorithm == 'SHA':
116
+            def sha_utf8(x):
117
+                if isinstance(x, str):
118
+                    x = x.encode('utf-8')
119
+                return hashlib.sha1(x).hexdigest()
120
+            hash_utf8 = sha_utf8
121
+
122
+        KD = lambda s, d: hash_utf8("%s:%s" % (s, d))
123
+
124
+        if hash_utf8 is None:
125
+            return None
126
+
127
+        # XXX not implemented yet
128
+        entdig = None
129
+        p_parsed = urlparse(url)
130
+        #: path is request-uri defined in RFC 2616 which should not be empty
131
+        path = p_parsed.path or "/"
132
+        if p_parsed.query:
133
+            path += '?' + p_parsed.query
134
+
135
+        A1 = '%s:%s:%s' % (self.username, realm, self.password)
136
+        A2 = '%s:%s' % (method, path)
137
+
138
+        HA1 = hash_utf8(A1)
139
+        HA2 = hash_utf8(A2)
140
+
141
+        if nonce == self._thread_local.last_nonce:
142
+            self._thread_local.nonce_count += 1
143
+        else:
144
+            self._thread_local.nonce_count = 1
145
+        ncvalue = '%08x' % self._thread_local.nonce_count
146
+        s = str(self._thread_local.nonce_count).encode('utf-8')
147
+        s += nonce.encode('utf-8')
148
+        s += time.ctime().encode('utf-8')
149
+        s += os.urandom(8)
150
+
151
+        cnonce = (hashlib.sha1(s).hexdigest()[:16])
152
+        if _algorithm == 'MD5-SESS':
153
+            HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce))
154
+
155
+        if not qop:
156
+            respdig = KD(HA1, "%s:%s" % (nonce, HA2))
157
+        elif qop == 'auth' or 'auth' in qop.split(','):
158
+            noncebit = "%s:%s:%s:%s:%s" % (
159
+                nonce, ncvalue, cnonce, 'auth', HA2
160
+                )
161
+            respdig = KD(HA1, noncebit)
162
+        else:
163
+            # XXX handle auth-int.
164
+            return None
165
+
166
+        self._thread_local.last_nonce = nonce
167
+
168
+        # XXX should the partial digests be encoded too?
169
+        base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \
170
+               'response="%s"' % (self.username, realm, nonce, path, respdig)
171
+        if opaque:
172
+            base += ', opaque="%s"' % opaque
173
+        if algorithm:
174
+            base += ', algorithm="%s"' % algorithm
175
+        if entdig:
176
+            base += ', digest="%s"' % entdig
177
+        if qop:
178
+            base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce)
179
+
180
+        return 'Digest %s' % (base)
181
+
182
+    def handle_redirect(self, r, **kwargs):
183
+        """Reset num_401_calls counter on redirects."""
184
+        if r.is_redirect:
185
+            self._thread_local.num_401_calls = 1
186
+
187
+    def handle_401(self, r, **kwargs):
188
+        """
189
+        Takes the given response and tries digest-auth, if needed.
190
+
191
+        :rtype: requests.Response
192
+        """
193
+
194
+        if self._thread_local.pos is not None:
195
+            # Rewind the file position indicator of the body to where
196
+            # it was to resend the request.
197
+            r.request.body.seek(self._thread_local.pos)
198
+        s_auth = r.headers.get('www-authenticate', '')
199
+
200
+        if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2:
201
+
202
+            self._thread_local.num_401_calls += 1
203
+            pat = re.compile(r'digest ', flags=re.IGNORECASE)
204
+            self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1))
205
+
206
+            # Consume content and release the original connection
207
+            # to allow our new request to reuse the same one.
208
+            r.content
209
+            r.close()
210
+            prep = r.request.copy()
211
+            extract_cookies_to_jar(prep._cookies, r.request, r.raw)
212
+            prep.prepare_cookies(prep._cookies)
213
+
214
+            prep.headers['Authorization'] = self.build_digest_header(
215
+                prep.method, prep.url)
216
+            _r = r.connection.send(prep, **kwargs)
217
+            _r.history.append(r)
218
+            _r.request = prep
219
+
220
+            return _r
221
+
222
+        self._thread_local.num_401_calls = 1
223
+        return r
224
+
225
+    def __call__(self, r):
226
+        # Initialize per-thread state, if needed
227
+        self.init_per_thread_state()
228
+        # If we have a saved nonce, skip the 401
229
+        if self._thread_local.last_nonce:
230
+            r.headers['Authorization'] = self.build_digest_header(r.method, r.url)
231
+        try:
232
+            self._thread_local.pos = r.body.tell()
233
+        except AttributeError:
234
+            # In the case of HTTPDigestAuth being reused and the body of
235
+            # the previous request was a file-like object, pos has the
236
+            # file position of the previous body. Ensure it's set to
237
+            # None.
238
+            self._thread_local.pos = None
239
+        r.register_hook('response', self.handle_401)
240
+        r.register_hook('response', self.handle_redirect)
241
+        self._thread_local.num_401_calls = 1
242
+
243
+        return r
244
+
245
+    def __eq__(self, other):
246
+        return all([
247
+            self.username == getattr(other, 'username', None),
248
+            self.password == getattr(other, 'password', None)
249
+        ])
250
+
251
+    def __ne__(self, other):
252
+        return not self == other

+ 5616
- 0
Contents/Libraries/Shared/requests/cacert.pem
File diff suppressed because it is too large
View File


+ 25
- 0
Contents/Libraries/Shared/requests/certs.py View File

1
+#!/usr/bin/env python
2
+# -*- coding: utf-8 -*-
3
+
4
+"""
5
+requests.certs
6
+~~~~~~~~~~~~~~
7
+
8
+This module returns the preferred default CA certificate bundle.
9
+
10
+If you are packaging Requests, e.g., for a Linux distribution or a managed
11
+environment, you can change the definition of where() to return a separately
12
+packaged CA bundle.
13
+"""
14
+import os.path
15
+
16
+try:
17
+    from certifi import where
18
+except ImportError:
19
+    def where():
20
+        """Return the preferred certificate bundle."""
21
+        # vendored bundle inside Requests
22
+        return os.path.join(os.path.dirname(__file__), 'cacert.pem')
23
+
24
+if __name__ == '__main__':
25
+    print(where())

+ 66
- 0
Contents/Libraries/Shared/requests/compat.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+requests.compat
5
+~~~~~~~~~~~~~~~
6
+
7
+This module handles import compatibility issues between Python 2 and
8
+Python 3.
9
+"""
10
+
11
+from .packages import chardet
12
+
13
+import sys
14
+
15
+# -------
16
+# Pythons
17
+# -------
18
+
19
+# Syntax sugar.
20
+_ver = sys.version_info
21
+
22
+#: Python 2.x?
23
+is_py2 = (_ver[0] == 2)
24
+
25
+#: Python 3.x?
26
+is_py3 = (_ver[0] == 3)
27
+
28
+try:
29
+    import simplejson as json
30
+except (ImportError, SyntaxError):
31
+    # simplejson does not support Python 3.2, it throws a SyntaxError
32
+    # because of u'...' Unicode literals.
33
+    import json
34
+
35
+# ---------
36
+# Specifics
37
+# ---------
38
+
39
+if is_py2:
40
+    from urllib import quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, proxy_bypass
41
+    from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag
42
+    from urllib2 import parse_http_list
43
+    import cookielib
44
+    from Cookie import Morsel
45
+    from StringIO import StringIO
46
+    from .packages.urllib3.packages.ordered_dict import OrderedDict
47
+
48
+    builtin_str = str
49
+    bytes = str
50
+    str = unicode
51
+    basestring = basestring
52
+    numeric_types = (int, long, float)
53
+
54
+elif is_py3:
55
+    from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag
56
+    from urllib.request import parse_http_list, getproxies, proxy_bypass
57
+    from http import cookiejar as cookielib
58
+    from http.cookies import Morsel
59
+    from io import StringIO
60
+    from collections import OrderedDict
61
+
62
+    builtin_str = str
63
+    str = str
64
+    bytes = bytes
65
+    basestring = (str, bytes)
66
+    numeric_types = (int, float)

+ 540
- 0
Contents/Libraries/Shared/requests/cookies.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+requests.cookies
5
+~~~~~~~~~~~~~~~~
6
+
7
+Compatibility code to be able to use `cookielib.CookieJar` with requests.
8
+
9
+requests.utils imports from here, so be careful with imports.
10
+"""
11
+
12
+import copy
13
+import time
14
+import calendar
15
+import collections
16
+from .compat import cookielib, urlparse, urlunparse, Morsel
17
+
18
+try:
19
+    import threading
20
+    # grr, pyflakes: this fixes "redefinition of unused 'threading'"
21
+    threading
22
+except ImportError:
23
+    import dummy_threading as threading
24
+
25
+
26
+class MockRequest(object):
27
+    """Wraps a `requests.Request` to mimic a `urllib2.Request`.
28
+
29
+    The code in `cookielib.CookieJar` expects this interface in order to correctly
30
+    manage cookie policies, i.e., determine whether a cookie can be set, given the
31
+    domains of the request and the cookie.
32
+
33
+    The original request object is read-only. The client is responsible for collecting
34
+    the new headers via `get_new_headers()` and interpreting them appropriately. You
35
+    probably want `get_cookie_header`, defined below.
36
+    """
37
+
38
+    def __init__(self, request):
39
+        self._r = request
40
+        self._new_headers = {}
41
+        self.type = urlparse(self._r.url).scheme
42
+
43
+    def get_type(self):
44
+        return self.type
45
+
46
+    def get_host(self):
47
+        return urlparse(self._r.url).netloc
48
+
49
+    def get_origin_req_host(self):
50
+        return self.get_host()
51
+
52
+    def get_full_url(self):
53
+        # Only return the response's URL if the user hadn't set the Host
54
+        # header
55
+        if not self._r.headers.get('Host'):
56
+            return self._r.url
57
+        # If they did set it, retrieve it and reconstruct the expected domain
58
+        host = self._r.headers['Host']
59
+        parsed = urlparse(self._r.url)
60
+        # Reconstruct the URL as we expect it
61
+        return urlunparse([
62
+            parsed.scheme, host, parsed.path, parsed.params, parsed.query,
63
+            parsed.fragment
64
+        ])
65
+
66
+    def is_unverifiable(self):
67
+        return True
68
+
69
+    def has_header(self, name):
70
+        return name in self._r.headers or name in self._new_headers
71
+
72
+    def get_header(self, name, default=None):
73
+        return self._r.headers.get(name, self._new_headers.get(name, default))
74
+
75
+    def add_header(self, key, val):
76
+        """cookielib has no legitimate use for this method; add it back if you find one."""
77
+        raise NotImplementedError("Cookie headers should be added with add_unredirected_header()")
78
+
79
+    def add_unredirected_header(self, name, value):
80
+        self._new_headers[name] = value
81
+
82
+    def get_new_headers(self):
83
+        return self._new_headers
84
+
85
+    @property
86
+    def unverifiable(self):
87
+        return self.is_unverifiable()
88
+
89
+    @property
90
+    def origin_req_host(self):
91
+        return self.get_origin_req_host()
92
+
93
+    @property
94
+    def host(self):
95
+        return self.get_host()
96
+
97
+
98
+class MockResponse(object):
99
+    """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`.
100
+
101
+    ...what? Basically, expose the parsed HTTP headers from the server response
102
+    the way `cookielib` expects to see them.
103
+    """
104
+
105
+    def __init__(self, headers):
106
+        """Make a MockResponse for `cookielib` to read.
107
+
108
+        :param headers: a httplib.HTTPMessage or analogous carrying the headers
109
+        """
110
+        self._headers = headers
111
+
112
+    def info(self):
113
+        return self._headers
114
+
115
+    def getheaders(self, name):
116
+        self._headers.getheaders(name)
117
+
118
+
119
+def extract_cookies_to_jar(jar, request, response):
120
+    """Extract the cookies from the response into a CookieJar.
121
+
122
+    :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar)
123
+    :param request: our own requests.Request object
124
+    :param response: urllib3.HTTPResponse object
125
+    """
126
+    if not (hasattr(response, '_original_response') and
127
+            response._original_response):
128
+        return
129
+    # the _original_response field is the wrapped httplib.HTTPResponse object,
130
+    req = MockRequest(request)
131
+    # pull out the HTTPMessage with the headers and put it in the mock:
132
+    res = MockResponse(response._original_response.msg)
133
+    jar.extract_cookies(res, req)
134
+
135
+
136
+def get_cookie_header(jar, request):
137
+    """
138
+    Produce an appropriate Cookie header string to be sent with `request`, or None.
139
+
140
+    :rtype: str
141
+    """
142
+    r = MockRequest(request)
143
+    jar.add_cookie_header(r)
144
+    return r.get_new_headers().get('Cookie')
145
+
146
+
147
+def remove_cookie_by_name(cookiejar, name, domain=None, path=None):
148
+    """Unsets a cookie by name, by default over all domains and paths.
149
+
150
+    Wraps CookieJar.clear(), is O(n).
151
+    """
152
+    clearables = []
153
+    for cookie in cookiejar:
154
+        if cookie.name != name:
155
+            continue
156
+        if domain is not None and domain != cookie.domain:
157
+            continue
158
+        if path is not None and path != cookie.path:
159
+            continue
160
+        clearables.append((cookie.domain, cookie.path, cookie.name))
161
+
162
+    for domain, path, name in clearables:
163
+        cookiejar.clear(domain, path, name)
164
+
165
+
166
+class CookieConflictError(RuntimeError):
167
+    """There are two cookies that meet the criteria specified in the cookie jar.
168
+    Use .get and .set and include domain and path args in order to be more specific.
169
+    """
170
+
171
+
172
+class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping):
173
+    """Compatibility class; is a cookielib.CookieJar, but exposes a dict
174
+    interface.
175
+
176
+    This is the CookieJar we create by default for requests and sessions that
177
+    don't specify one, since some clients may expect response.cookies and
178
+    session.cookies to support dict operations.
179
+
180
+    Requests does not use the dict interface internally; it's just for
181
+    compatibility with external client code. All requests code should work
182
+    out of the box with externally provided instances of ``CookieJar``, e.g.
183
+    ``LWPCookieJar`` and ``FileCookieJar``.
184
+
185
+    Unlike a regular CookieJar, this class is pickleable.
186
+
187
+    .. warning:: dictionary operations that are normally O(1) may be O(n).
188
+    """
189
+
190
+    def get(self, name, default=None, domain=None, path=None):
191
+        """Dict-like get() that also supports optional domain and path args in
192
+        order to resolve naming collisions from using one cookie jar over
193
+        multiple domains.
194
+
195
+        .. warning:: operation is O(n), not O(1).
196
+        """
197
+        try:
198
+            return self._find_no_duplicates(name, domain, path)
199
+        except KeyError:
200
+            return default
201
+
202
+    def set(self, name, value, **kwargs):
203
+        """Dict-like set() that also supports optional domain and path args in
204
+        order to resolve naming collisions from using one cookie jar over
205
+        multiple domains.
206
+        """
207
+        # support client code that unsets cookies by assignment of a None value:
208
+        if value is None:
209
+            remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path'))
210
+            return
211
+
212
+        if isinstance(value, Morsel):
213
+            c = morsel_to_cookie(value)
214
+        else:
215
+            c = create_cookie(name, value, **kwargs)
216
+        self.set_cookie(c)
217
+        return c
218
+
219
+    def iterkeys(self):
220
+        """Dict-like iterkeys() that returns an iterator of names of cookies
221
+        from the jar.
222
+
223
+        .. seealso:: itervalues() and iteritems().
224
+        """
225
+        for cookie in iter(self):
226
+            yield cookie.name
227
+
228
+    def keys(self):
229
+        """Dict-like keys() that returns a list of names of cookies from the
230
+        jar.
231
+
232
+        .. seealso:: values() and items().
233
+        """
234
+        return list(self.iterkeys())
235
+
236
+    def itervalues(self):
237
+        """Dict-like itervalues() that returns an iterator of values of cookies
238
+        from the jar.
239
+
240
+        .. seealso:: iterkeys() and iteritems().
241
+        """
242
+        for cookie in iter(self):
243
+            yield cookie.value
244
+
245
+    def values(self):
246
+        """Dict-like values() that returns a list of values of cookies from the
247
+        jar.
248
+
249
+        .. seealso:: keys() and items().
250
+        """
251
+        return list(self.itervalues())
252
+
253
+    def iteritems(self):
254
+        """Dict-like iteritems() that returns an iterator of name-value tuples
255
+        from the jar.
256
+
257
+        .. seealso:: iterkeys() and itervalues().
258
+        """
259
+        for cookie in iter(self):
260
+            yield cookie.name, cookie.value
261
+
262
+    def items(self):
263
+        """Dict-like items() that returns a list of name-value tuples from the
264
+        jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a
265
+        vanilla python dict of key value pairs.
266
+
267
+        .. seealso:: keys() and values().
268
+        """
269
+        return list(self.iteritems())
270
+
271
+    def list_domains(self):
272
+        """Utility method to list all the domains in the jar."""
273
+        domains = []
274
+        for cookie in iter(self):
275
+            if cookie.domain not in domains:
276
+                domains.append(cookie.domain)
277
+        return domains
278
+
279
+    def list_paths(self):
280
+        """Utility method to list all the paths in the jar."""
281
+        paths = []
282
+        for cookie in iter(self):
283
+            if cookie.path not in paths:
284
+                paths.append(cookie.path)
285
+        return paths
286
+
287
+    def multiple_domains(self):
288
+        """Returns True if there are multiple domains in the jar.
289
+        Returns False otherwise.
290
+
291
+        :rtype: bool
292
+        """
293
+        domains = []
294
+        for cookie in iter(self):
295
+            if cookie.domain is not None and cookie.domain in domains:
296
+                return True
297
+            domains.append(cookie.domain)
298
+        return False  # there is only one domain in jar
299
+
300
+    def get_dict(self, domain=None, path=None):
301
+        """Takes as an argument an optional domain and path and returns a plain
302
+        old Python dict of name-value pairs of cookies that meet the
303
+        requirements.
304
+
305
+        :rtype: dict
306
+        """
307
+        dictionary = {}
308
+        for cookie in iter(self):
309
+            if (domain is None or cookie.domain == domain) and (path is None
310
+                                                or cookie.path == path):
311
+                dictionary[cookie.name] = cookie.value
312
+        return dictionary
313
+
314
+    def __contains__(self, name):
315
+        try:
316
+            return super(RequestsCookieJar, self).__contains__(name)
317
+        except CookieConflictError:
318
+            return True
319
+
320
+    def __getitem__(self, name):
321
+        """Dict-like __getitem__() for compatibility with client code. Throws
322
+        exception if there are more than one cookie with name. In that case,
323
+        use the more explicit get() method instead.
324
+
325
+        .. warning:: operation is O(n), not O(1).
326
+        """
327
+        return self._find_no_duplicates(name)
328
+
329
+    def __setitem__(self, name, value):
330
+        """Dict-like __setitem__ for compatibility with client code. Throws
331
+        exception if there is already a cookie of that name in the jar. In that
332
+        case, use the more explicit set() method instead.
333
+        """
334
+        self.set(name, value)
335
+
336
+    def __delitem__(self, name):
337
+        """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s
338
+        ``remove_cookie_by_name()``.
339
+        """
340
+        remove_cookie_by_name(self, name)
341
+
342
+    def set_cookie(self, cookie, *args, **kwargs):
343
+        if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'):
344
+            cookie.value = cookie.value.replace('\\"', '')
345
+        return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs)
346
+
347
+    def update(self, other):
348
+        """Updates this jar with cookies from another CookieJar or dict-like"""
349
+        if isinstance(other, cookielib.CookieJar):
350
+            for cookie in other:
351
+                self.set_cookie(copy.copy(cookie))
352
+        else:
353
+            super(RequestsCookieJar, self).update(other)
354
+
355
+    def _find(self, name, domain=None, path=None):
356
+        """Requests uses this method internally to get cookie values.
357
+
358
+        If there are conflicting cookies, _find arbitrarily chooses one.
359
+        See _find_no_duplicates if you want an exception thrown if there are
360
+        conflicting cookies.
361
+
362
+        :param name: a string containing name of cookie
363
+        :param domain: (optional) string containing domain of cookie
364
+        :param path: (optional) string containing path of cookie
365
+        :return: cookie.value
366
+        """
367
+        for cookie in iter(self):
368
+            if cookie.name == name:
369
+                if domain is None or cookie.domain == domain:
370
+                    if path is None or cookie.path == path:
371
+                        return cookie.value
372
+
373
+        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
374
+
375
+    def _find_no_duplicates(self, name, domain=None, path=None):
376
+        """Both ``__get_item__`` and ``get`` call this function: it's never
377
+        used elsewhere in Requests.
378
+
379
+        :param name: a string containing name of cookie
380
+        :param domain: (optional) string containing domain of cookie
381
+        :param path: (optional) string containing path of cookie
382
+        :raises KeyError: if cookie is not found
383
+        :raises CookieConflictError: if there are multiple cookies
384
+            that match name and optionally domain and path
385
+        :return: cookie.value
386
+        """
387
+        toReturn = None
388
+        for cookie in iter(self):
389
+            if cookie.name == name:
390
+                if domain is None or cookie.domain == domain:
391
+                    if path is None or cookie.path == path:
392
+                        if toReturn is not None:  # if there are multiple cookies that meet passed in criteria
393
+                            raise CookieConflictError('There are multiple cookies with name, %r' % (name))
394
+                        toReturn = cookie.value  # we will eventually return this as long as no cookie conflict
395
+
396
+        if toReturn:
397
+            return toReturn
398
+        raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
399
+
400
+    def __getstate__(self):
401
+        """Unlike a normal CookieJar, this class is pickleable."""
402
+        state = self.__dict__.copy()
403
+        # remove the unpickleable RLock object
404
+        state.pop('_cookies_lock')
405
+        return state
406
+
407
+    def __setstate__(self, state):
408
+        """Unlike a normal CookieJar, this class is pickleable."""
409
+        self.__dict__.update(state)
410
+        if '_cookies_lock' not in self.__dict__:
411
+            self._cookies_lock = threading.RLock()
412
+
413
+    def copy(self):
414
+        """Return a copy of this RequestsCookieJar."""
415
+        new_cj = RequestsCookieJar()
416
+        new_cj.update(self)
417
+        return new_cj
418
+
419
+
420
+def _copy_cookie_jar(jar):
421
+    if jar is None:
422
+        return None
423
+
424
+    if hasattr(jar, 'copy'):
425
+        # We're dealing with an instance of RequestsCookieJar
426
+        return jar.copy()
427
+    # We're dealing with a generic CookieJar instance
428
+    new_jar = copy.copy(jar)
429
+    new_jar.clear()
430
+    for cookie in jar:
431
+        new_jar.set_cookie(copy.copy(cookie))
432
+    return new_jar
433
+
434
+
435
+def create_cookie(name, value, **kwargs):
436
+    """Make a cookie from underspecified parameters.
437
+
438
+    By default, the pair of `name` and `value` will be set for the domain ''
439
+    and sent on every request (this is sometimes called a "supercookie").
440
+    """
441
+    result = dict(
442
+        version=0,
443
+        name=name,
444
+        value=value,
445
+        port=None,
446
+        domain='',
447
+        path='/',
448
+        secure=False,
449
+        expires=None,
450
+        discard=True,
451
+        comment=None,
452
+        comment_url=None,
453
+        rest={'HttpOnly': None},
454
+        rfc2109=False,)
455
+
456
+    badargs = set(kwargs) - set(result)
457
+    if badargs:
458
+        err = 'create_cookie() got unexpected keyword arguments: %s'
459
+        raise TypeError(err % list(badargs))
460
+
461
+    result.update(kwargs)
462
+    result['port_specified'] = bool(result['port'])
463
+    result['domain_specified'] = bool(result['domain'])
464
+    result['domain_initial_dot'] = result['domain'].startswith('.')
465
+    result['path_specified'] = bool(result['path'])
466
+
467
+    return cookielib.Cookie(**result)
468
+
469
+
470
+def morsel_to_cookie(morsel):
471
+    """Convert a Morsel object into a Cookie containing the one k/v pair."""
472
+
473
+    expires = None
474
+    if morsel['max-age']:
475
+        try:
476
+            expires = int(time.time() + int(morsel['max-age']))
477
+        except ValueError:
478
+            raise TypeError('max-age: %s must be integer' % morsel['max-age'])
479
+    elif morsel['expires']:
480
+        time_template = '%a, %d-%b-%Y %H:%M:%S GMT'
481
+        expires = calendar.timegm(
482
+            time.strptime(morsel['expires'], time_template)
483
+        )
484
+    return create_cookie(
485
+        comment=morsel['comment'],
486
+        comment_url=bool(morsel['comment']),
487
+        discard=False,
488
+        domain=morsel['domain'],
489
+        expires=expires,
490
+        name=morsel.key,
491
+        path=morsel['path'],
492
+        port=None,
493
+        rest={'HttpOnly': morsel['httponly']},
494
+        rfc2109=False,
495
+        secure=bool(morsel['secure']),
496
+        value=morsel.value,
497
+        version=morsel['version'] or 0,
498
+    )
499
+
500
+
501
+def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True):
502
+    """Returns a CookieJar from a key/value dictionary.
503
+
504
+    :param cookie_dict: Dict of key/values to insert into CookieJar.
505
+    :param cookiejar: (optional) A cookiejar to add the cookies to.
506
+    :param overwrite: (optional) If False, will not replace cookies
507
+        already in the jar with new ones.
508
+    """
509
+    if cookiejar is None:
510
+        cookiejar = RequestsCookieJar()
511
+
512
+    if cookie_dict is not None:
513
+        names_from_jar = [cookie.name for cookie in cookiejar]
514
+        for name in cookie_dict:
515
+            if overwrite or (name not in names_from_jar):
516
+                cookiejar.set_cookie(create_cookie(name, cookie_dict[name]))
517
+
518
+    return cookiejar
519
+
520
+
521
+def merge_cookies(cookiejar, cookies):
522
+    """Add cookies to cookiejar and returns a merged CookieJar.
523
+
524
+    :param cookiejar: CookieJar object to add the cookies to.
525
+    :param cookies: Dictionary or CookieJar object to be added.
526
+    """
527
+    if not isinstance(cookiejar, cookielib.CookieJar):
528
+        raise ValueError('You can only merge into CookieJar')
529
+
530
+    if isinstance(cookies, dict):
531
+        cookiejar = cookiejar_from_dict(
532
+            cookies, cookiejar=cookiejar, overwrite=False)
533
+    elif isinstance(cookies, cookielib.CookieJar):
534
+        try:
535
+            cookiejar.update(cookies)
536
+        except AttributeError:
537
+            for cookie_in_jar in cookies:
538
+                cookiejar.set_cookie(cookie_in_jar)
539
+
540
+    return cookiejar

+ 114
- 0
Contents/Libraries/Shared/requests/exceptions.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+requests.exceptions
5
+~~~~~~~~~~~~~~~~~~~
6
+
7
+This module contains the set of Requests' exceptions.
8
+"""
9
+from .packages.urllib3.exceptions import HTTPError as BaseHTTPError
10
+
11
+
12
+class RequestException(IOError):
13
+    """There was an ambiguous exception that occurred while handling your
14
+    request.
15
+    """
16
+
17
+    def __init__(self, *args, **kwargs):
18
+        """Initialize RequestException with `request` and `response` objects."""
19
+        response = kwargs.pop('response', None)
20
+        self.response = response
21
+        self.request = kwargs.pop('request', None)
22
+        if (response is not None and not self.request and
23
+                hasattr(response, 'request')):
24
+            self.request = self.response.request
25
+        super(RequestException, self).__init__(*args, **kwargs)
26
+
27
+
28
+class HTTPError(RequestException):
29
+    """An HTTP error occurred."""
30
+
31
+
32
+class ConnectionError(RequestException):
33
+    """A Connection error occurred."""
34
+
35
+
36
+class ProxyError(ConnectionError):
37
+    """A proxy error occurred."""
38
+
39
+
40
+class SSLError(ConnectionError):
41
+    """An SSL error occurred."""
42
+
43
+
44
+class Timeout(RequestException):
45
+    """The request timed out.
46
+
47
+    Catching this error will catch both
48
+    :exc:`~requests.exceptions.ConnectTimeout` and
49
+    :exc:`~requests.exceptions.ReadTimeout` errors.
50
+    """
51
+
52
+
53
+class ConnectTimeout(ConnectionError, Timeout):
54
+    """The request timed out while trying to connect to the remote server.
55
+
56
+    Requests that produced this error are safe to retry.
57
+    """
58
+
59
+
60
+class ReadTimeout(Timeout):
61
+    """The server did not send any data in the allotted amount of time."""
62
+
63
+
64
+class URLRequired(RequestException):
65
+    """A valid URL is required to make a request."""
66
+
67
+
68
+class TooManyRedirects(RequestException):
69
+    """Too many redirects."""
70
+
71
+
72
+class MissingSchema(RequestException, ValueError):
73
+    """The URL schema (e.g. http or https) is missing."""
74
+
75
+
76
+class InvalidSchema(RequestException, ValueError):
77
+    """See defaults.py for valid schemas."""
78
+
79
+
80
+class InvalidURL(RequestException, ValueError):
81
+    """The URL provided was somehow invalid."""
82
+
83
+
84
+class InvalidHeader(RequestException, ValueError):
85
+    """The header value provided was somehow invalid."""
86
+
87
+
88
+class ChunkedEncodingError(RequestException):
89
+    """The server declared chunked encoding but sent an invalid chunk."""
90
+
91
+
92
+class ContentDecodingError(RequestException, BaseHTTPError):
93
+    """Failed to decode response content"""
94
+
95
+
96
+class StreamConsumedError(RequestException, TypeError):
97
+    """The content for this response was already consumed"""
98
+
99
+
100
+class RetryError(RequestException):
101
+    """Custom retries logic failed"""
102
+
103
+
104
+# Warnings
105
+
106
+
107
+class RequestsWarning(Warning):
108
+    """Base warning for Requests."""
109
+    pass
110
+
111
+
112
+class FileModeWarning(RequestsWarning, DeprecationWarning):
113
+    """A file was opened in text mode, but Requests determined its binary length."""
114
+    pass

+ 34
- 0
Contents/Libraries/Shared/requests/hooks.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+requests.hooks
5
+~~~~~~~~~~~~~~
6
+
7
+This module provides the capabilities for the Requests hooks system.
8
+
9
+Available hooks:
10
+
11
+``response``:
12
+    The response generated from a Request.
13
+"""
14
+HOOKS = ['response']
15
+
16
+
17
+def default_hooks():
18
+    return dict((event, []) for event in HOOKS)
19
+
20
+# TODO: response is the only one
21
+
22
+
23
+def dispatch_hook(key, hooks, hook_data, **kwargs):
24
+    """Dispatches a hook dictionary on a given piece of data."""
25
+    hooks = hooks or dict()
26
+    hooks = hooks.get(key)
27
+    if hooks:
28
+        if hasattr(hooks, '__call__'):
29
+            hooks = [hooks]
30
+        for hook in hooks:
31
+            _hook_data = hook(hook_data, **kwargs)
32
+            if _hook_data is not None:
33
+                hook_data = _hook_data
34
+    return hook_data

+ 873
- 0
Contents/Libraries/Shared/requests/models.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+requests.models
5
+~~~~~~~~~~~~~~~
6
+
7
+This module contains the primary objects that power Requests.
8
+"""
9
+
10
+import collections
11
+import datetime
12
+
13
+from io import BytesIO, UnsupportedOperation
14
+from .hooks import default_hooks
15
+from .structures import CaseInsensitiveDict
16
+
17
+from .auth import HTTPBasicAuth
18
+from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar
19
+from .packages.urllib3.fields import RequestField
20
+from .packages.urllib3.filepost import encode_multipart_formdata
21
+from .packages.urllib3.util import parse_url
22
+from .packages.urllib3.exceptions import (
23
+    DecodeError, ReadTimeoutError, ProtocolError, LocationParseError)
24
+from .exceptions import (
25
+    HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError,
26
+    ContentDecodingError, ConnectionError, StreamConsumedError)
27
+from .utils import (
28
+    guess_filename, get_auth_from_url, requote_uri,
29
+    stream_decode_response_unicode, to_key_val_list, parse_header_links,
30
+    iter_slices, guess_json_utf, super_len, to_native_string,
31
+    check_header_validity)
32
+from .compat import (
33
+    cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO,
34
+    is_py2, chardet, builtin_str, basestring)
35
+from .compat import json as complexjson
36
+from .status_codes import codes
37
+
38
+#: The set of HTTP status codes that indicate an automatically
39
+#: processable redirect.
40
+REDIRECT_STATI = (
41
+    codes.moved,               # 301
42
+    codes.found,               # 302
43
+    codes.other,               # 303
44
+    codes.temporary_redirect,  # 307
45
+    codes.permanent_redirect,  # 308
46
+)
47
+
48
+DEFAULT_REDIRECT_LIMIT = 30
49
+CONTENT_CHUNK_SIZE = 10 * 1024
50
+ITER_CHUNK_SIZE = 512
51
+
52
+
53
+class RequestEncodingMixin(object):
54
+    @property
55
+    def path_url(self):
56
+        """Build the path URL to use."""
57
+
58
+        url = []
59
+
60
+        p = urlsplit(self.url)
61
+
62
+        path = p.path
63
+        if not path:
64
+            path = '/'
65
+
66
+        url.append(path)
67
+
68
+        query = p.query
69
+        if query:
70
+            url.append('?')
71
+            url.append(query)
72
+
73
+        return ''.join(url)
74
+
75
+    @staticmethod
76
+    def _encode_params(data):
77
+        """Encode parameters in a piece of data.
78
+
79
+        Will successfully encode parameters when passed as a dict or a list of
80
+        2-tuples. Order is retained if data is a list of 2-tuples but arbitrary
81
+        if parameters are supplied as a dict.
82
+        """
83
+
84
+        if isinstance(data, (str, bytes)):
85
+            return data
86
+        elif hasattr(data, 'read'):
87
+            return data
88
+        elif hasattr(data, '__iter__'):
89
+            result = []
90
+            for k, vs in to_key_val_list(data):
91
+                if isinstance(vs, basestring) or not hasattr(vs, '__iter__'):
92
+                    vs = [vs]
93
+                for v in vs:
94
+                    if v is not None:
95
+                        result.append(
96
+                            (k.encode('utf-8') if isinstance(k, str) else k,
97
+                             v.encode('utf-8') if isinstance(v, str) else v))
98
+            return urlencode(result, doseq=True)
99
+        else:
100
+            return data
101
+
102
+    @staticmethod
103
+    def _encode_files(files, data):
104
+        """Build the body for a multipart/form-data request.
105
+
106
+        Will successfully encode files when passed as a dict or a list of
107
+        tuples. Order is retained if data is a list of tuples but arbitrary
108
+        if parameters are supplied as a dict.
109
+        The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype)
110
+        or 4-tuples (filename, fileobj, contentype, custom_headers).
111
+        """
112
+        if (not files):
113
+            raise ValueError("Files must be provided.")
114
+        elif isinstance(data, basestring):
115
+            raise ValueError("Data must not be a string.")
116
+
117
+        new_fields = []
118
+        fields = to_key_val_list(data or {})
119
+        files = to_key_val_list(files or {})
120
+
121
+        for field, val in fields:
122
+            if isinstance(val, basestring) or not hasattr(val, '__iter__'):
123
+                val = [val]
124
+            for v in val:
125
+                if v is not None:
126
+                    # Don't call str() on bytestrings: in Py3 it all goes wrong.
127
+                    if not isinstance(v, bytes):
128
+                        v = str(v)
129
+
130
+                    new_fields.append(
131
+                        (field.decode('utf-8') if isinstance(field, bytes) else field,
132
+                         v.encode('utf-8') if isinstance(v, str) else v))
133
+
134
+        for (k, v) in files:
135
+            # support for explicit filename
136
+            ft = None
137
+            fh = None
138
+            if isinstance(v, (tuple, list)):
139
+                if len(v) == 2:
140
+                    fn, fp = v
141
+                elif len(v) == 3:
142
+                    fn, fp, ft = v
143
+                else:
144
+                    fn, fp, ft, fh = v
145
+            else:
146
+                fn = guess_filename(v) or k
147
+                fp = v
148
+
149
+            if isinstance(fp, (str, bytes, bytearray)):
150
+                fdata = fp
151
+            else:
152
+                fdata = fp.read()
153
+
154
+            rf = RequestField(name=k, data=fdata, filename=fn, headers=fh)
155
+            rf.make_multipart(content_type=ft)
156
+            new_fields.append(rf)
157
+
158
+        body, content_type = encode_multipart_formdata(new_fields)
159
+
160
+        return body, content_type
161
+
162
+
163
+class RequestHooksMixin(object):
164
+    def register_hook(self, event, hook):
165
+        """Properly register a hook."""
166
+
167
+        if event not in self.hooks:
168
+            raise ValueError('Unsupported event specified, with event name "%s"' % (event))
169
+
170
+        if isinstance(hook, collections.Callable):
171
+            self.hooks[event].append(hook)
172
+        elif hasattr(hook, '__iter__'):
173
+            self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable))
174
+
175
+    def deregister_hook(self, event, hook):
176
+        """Deregister a previously registered hook.
177
+        Returns True if the hook existed, False if not.
178
+        """
179
+
180
+        try:
181
+            self.hooks[event].remove(hook)
182
+            return True
183
+        except ValueError:
184
+            return False
185
+
186
+
187
+class Request(RequestHooksMixin):
188
+    """A user-created :class:`Request <Request>` object.
189
+
190
+    Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server.
191
+
192
+    :param method: HTTP method to use.
193
+    :param url: URL to send.
194
+    :param headers: dictionary of headers to send.
195
+    :param files: dictionary of {filename: fileobject} files to multipart upload.
196
+    :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place.
197
+    :param json: json for the body to attach to the request (if files or data is not specified).
198
+    :param params: dictionary of URL parameters to append to the URL.
199
+    :param auth: Auth handler or (user, pass) tuple.
200
+    :param cookies: dictionary or CookieJar of cookies to attach to this request.
201
+    :param hooks: dictionary of callback hooks, for internal usage.
202
+
203
+    Usage::
204
+
205
+      >>> import requests
206
+      >>> req = requests.Request('GET', 'http://httpbin.org/get')
207
+      >>> req.prepare()
208
+      <PreparedRequest [GET]>
209
+    """
210
+
211
+    def __init__(self, method=None, url=None, headers=None, files=None,
212
+        data=None, params=None, auth=None, cookies=None, hooks=None, json=None):
213
+
214
+        # Default empty dicts for dict params.
215
+        data = [] if data is None else data
216
+        files = [] if files is None else files
217
+        headers = {} if headers is None else headers
218
+        params = {} if params is None else params
219
+        hooks = {} if hooks is None else hooks
220
+
221
+        self.hooks = default_hooks()
222
+        for (k, v) in list(hooks.items()):
223
+            self.register_hook(event=k, hook=v)
224
+
225
+        self.method = method
226
+        self.url = url
227
+        self.headers = headers
228
+        self.files = files
229
+        self.data = data
230
+        self.json = json
231
+        self.params = params
232
+        self.auth = auth
233
+        self.cookies = cookies
234
+
235
+    def __repr__(self):
236
+        return '<Request [%s]>' % (self.method)
237
+
238
+    def prepare(self):
239
+        """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it."""
240
+        p = PreparedRequest()
241
+        p.prepare(
242
+            method=self.method,
243
+            url=self.url,
244
+            headers=self.headers,
245
+            files=self.files,
246
+            data=self.data,
247
+            json=self.json,
248
+            params=self.params,
249
+            auth=self.auth,
250
+            cookies=self.cookies,
251
+            hooks=self.hooks,
252
+        )
253
+        return p
254
+
255
+
256
+class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
257
+    """The fully mutable :class:`PreparedRequest <PreparedRequest>` object,
258
+    containing the exact bytes that will be sent to the server.
259
+
260
+    Generated from either a :class:`Request <Request>` object or manually.
261
+
262
+    Usage::
263
+
264
+      >>> import requests
265
+      >>> req = requests.Request('GET', 'http://httpbin.org/get')
266
+      >>> r = req.prepare()
267
+      <PreparedRequest [GET]>
268
+
269
+      >>> s = requests.Session()
270
+      >>> s.send(r)
271
+      <Response [200]>
272
+    """
273
+
274
+    def __init__(self):
275
+        #: HTTP verb to send to the server.
276
+        self.method = None
277
+        #: HTTP URL to send the request to.
278
+        self.url = None
279
+        #: dictionary of HTTP headers.
280
+        self.headers = None
281
+        # The `CookieJar` used to create the Cookie header will be stored here
282
+        # after prepare_cookies is called
283
+        self._cookies = None
284
+        #: request body to send to the server.
285
+        self.body = None
286
+        #: dictionary of callback hooks, for internal usage.
287
+        self.hooks = default_hooks()
288
+
289
+    def prepare(self, method=None, url=None, headers=None, files=None,
290
+        data=None, params=None, auth=None, cookies=None, hooks=None, json=None):
291
+        """Prepares the entire request with the given parameters."""
292
+
293
+        self.prepare_method(method)
294
+        self.prepare_url(url, params)
295
+        self.prepare_headers(headers)
296
+        self.prepare_cookies(cookies)
297
+        self.prepare_body(data, files, json)
298
+        self.prepare_auth(auth, url)
299
+
300
+        # Note that prepare_auth must be last to enable authentication schemes
301
+        # such as OAuth to work on a fully prepared request.
302
+
303
+        # This MUST go after prepare_auth. Authenticators could add a hook
304
+        self.prepare_hooks(hooks)
305
+
306
+    def __repr__(self):
307
+        return '<PreparedRequest [%s]>' % (self.method)
308
+
309
+    def copy(self):
310
+        p = PreparedRequest()
311
+        p.method = self.method
312
+        p.url = self.url
313
+        p.headers = self.headers.copy() if self.headers is not None else None
314
+        p._cookies = _copy_cookie_jar(self._cookies)
315
+        p.body = self.body
316
+        p.hooks = self.hooks
317
+        return p
318
+
319
+    def prepare_method(self, method):
320
+        """Prepares the given HTTP method."""
321
+        self.method = method
322
+        if self.method is not None:
323
+            self.method = to_native_string(self.method.upper())
324
+
325
+    def prepare_url(self, url, params):
326
+        """Prepares the given HTTP URL."""
327
+        #: Accept objects that have string representations.
328
+        #: We're unable to blindly call unicode/str functions
329
+        #: as this will include the bytestring indicator (b'')
330
+        #: on python 3.x.
331
+        #: https://github.com/kennethreitz/requests/pull/2238
332
+        if isinstance(url, bytes):
333
+            url = url.decode('utf8')
334
+        else:
335
+            url = unicode(url) if is_py2 else str(url)
336
+
337
+        # Don't do any URL preparation for non-HTTP schemes like `mailto`,
338
+        # `data` etc to work around exceptions from `url_parse`, which
339
+        # handles RFC 3986 only.
340
+        if ':' in url and not url.lower().startswith('http'):
341
+            self.url = url
342
+            return
343
+
344
+        # Support for unicode domain names and paths.
345
+        try:
346
+            scheme, auth, host, port, path, query, fragment = parse_url(url)
347
+        except LocationParseError as e:
348
+            raise InvalidURL(*e.args)
349
+
350
+        if not scheme:
351
+            error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?")
352
+            error = error.format(to_native_string(url, 'utf8'))
353
+
354
+            raise MissingSchema(error)
355
+
356
+        if not host:
357
+            raise InvalidURL("Invalid URL %r: No host supplied" % url)
358
+
359
+        # Only want to apply IDNA to the hostname
360
+        try:
361
+            host = host.encode('idna').decode('utf-8')
362
+        except UnicodeError:
363
+            raise InvalidURL('URL has an invalid label.')
364
+
365
+        # Carefully reconstruct the network location
366
+        netloc = auth or ''
367
+        if netloc:
368
+            netloc += '@'
369
+        netloc += host
370
+        if port:
371
+            netloc += ':' + str(port)
372
+
373
+        # Bare domains aren't valid URLs.
374
+        if not path:
375
+            path = '/'
376
+
377
+        if is_py2:
378
+            if isinstance(scheme, str):
379
+                scheme = scheme.encode('utf-8')
380
+            if isinstance(netloc, str):
381
+                netloc = netloc.encode('utf-8')
382
+            if isinstance(path, str):
383
+                path = path.encode('utf-8')
384
+            if isinstance(query, str):
385
+                query = query.encode('utf-8')
386
+            if isinstance(fragment, str):
387
+                fragment = fragment.encode('utf-8')
388
+
389
+        if isinstance(params, (str, bytes)):
390
+            params = to_native_string(params)
391
+
392
+        enc_params = self._encode_params(params)
393
+        if enc_params:
394
+            if query:
395
+                query = '%s&%s' % (query, enc_params)
396
+            else:
397
+                query = enc_params
398
+
399
+        url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment]))
400
+        self.url = url
401
+
402
+    def prepare_headers(self, headers):
403
+        """Prepares the given HTTP headers."""
404
+
405
+        self.headers = CaseInsensitiveDict()
406
+        if headers:
407
+            for header in headers.items():
408
+                # Raise exception on invalid header value.
409
+                check_header_validity(header)
410
+                name, value = header
411
+                self.headers[to_native_string(name)] = value
412
+
413
+    def prepare_body(self, data, files, json=None):
414
+        """Prepares the given HTTP body data."""
415
+
416
+        # Check if file, fo, generator, iterator.
417
+        # If not, run through normal process.
418
+
419
+        # Nottin' on you.
420
+        body = None
421
+        content_type = None
422
+        length = None
423
+
424
+        if not data and json is not None:
425
+            # urllib3 requires a bytes-like body. Python 2's json.dumps
426
+            # provides this natively, but Python 3 gives a Unicode string.
427
+            content_type = 'application/json'
428
+            body = complexjson.dumps(json)
429
+            if not isinstance(body, bytes):
430
+                body = body.encode('utf-8')
431
+
432
+        is_stream = all([
433
+            hasattr(data, '__iter__'),
434
+            not isinstance(data, (basestring, list, tuple, dict))
435
+        ])
436
+
437
+        try:
438
+            length = super_len(data)
439
+        except (TypeError, AttributeError, UnsupportedOperation):
440
+            length = None
441
+
442
+        if is_stream:
443
+            body = data
444
+
445
+            if files:
446
+                raise NotImplementedError('Streamed bodies and files are mutually exclusive.')
447
+
448
+            if length:
449
+                self.headers['Content-Length'] = builtin_str(length)
450
+            else:
451
+                self.headers['Transfer-Encoding'] = 'chunked'
452
+        else:
453
+            # Multi-part file uploads.
454
+            if files:
455
+                (body, content_type) = self._encode_files(files, data)
456
+            else:
457
+                if data:
458
+                    body = self._encode_params(data)
459
+                    if isinstance(data, basestring) or hasattr(data, 'read'):
460
+                        content_type = None
461
+                    else:
462
+                        content_type = 'application/x-www-form-urlencoded'
463
+
464
+            self.prepare_content_length(body)
465
+
466
+            # Add content-type if it wasn't explicitly provided.
467
+            if content_type and ('content-type' not in self.headers):
468
+                self.headers['Content-Type'] = content_type
469
+
470
+        self.body = body
471
+
472
+    def prepare_content_length(self, body):
473
+        if hasattr(body, 'seek') and hasattr(body, 'tell'):
474
+            curr_pos = body.tell()
475
+            body.seek(0, 2)
476
+            end_pos = body.tell()
477
+            self.headers['Content-Length'] = builtin_str(max(0, end_pos - curr_pos))
478
+            body.seek(curr_pos, 0)
479
+        elif body is not None:
480
+            l = super_len(body)
481
+            if l:
482
+                self.headers['Content-Length'] = builtin_str(l)
483
+        elif (self.method not in ('GET', 'HEAD')) and (self.headers.get('Content-Length') is None):
484
+            self.headers['Content-Length'] = '0'
485
+
486
+    def prepare_auth(self, auth, url=''):
487
+        """Prepares the given HTTP auth data."""
488
+
489
+        # If no Auth is explicitly provided, extract it from the URL first.
490
+        if auth is None:
491
+            url_auth = get_auth_from_url(self.url)
492
+            auth = url_auth if any(url_auth) else None
493
+
494
+        if auth:
495
+            if isinstance(auth, tuple) and len(auth) == 2:
496
+                # special-case basic HTTP auth
497
+                auth = HTTPBasicAuth(*auth)
498
+
499
+            # Allow auth to make its changes.
500
+            r = auth(self)
501
+
502
+            # Update self to reflect the auth changes.
503
+            self.__dict__.update(r.__dict__)
504
+
505
+            # Recompute Content-Length
506
+            self.prepare_content_length(self.body)
507
+
508
+    def prepare_cookies(self, cookies):
509
+        """Prepares the given HTTP cookie data.
510
+
511
+        This function eventually generates a ``Cookie`` header from the
512
+        given cookies using cookielib. Due to cookielib's design, the header
513
+        will not be regenerated if it already exists, meaning this function
514
+        can only be called once for the life of the
515
+        :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls
516
+        to ``prepare_cookies`` will have no actual effect, unless the "Cookie"
517
+        header is removed beforehand.
518
+        """
519
+        if isinstance(cookies, cookielib.CookieJar):
520
+            self._cookies = cookies
521
+        else:
522
+            self._cookies = cookiejar_from_dict(cookies)
523
+
524
+        cookie_header = get_cookie_header(self._cookies, self)
525
+        if cookie_header is not None:
526
+            self.headers['Cookie'] = cookie_header
527
+
528
+    def prepare_hooks(self, hooks):
529
+        """Prepares the given hooks."""
530
+        # hooks can be passed as None to the prepare method and to this
531
+        # method. To prevent iterating over None, simply use an empty list
532
+        # if hooks is False-y
533
+        hooks = hooks or []
534
+        for event in hooks:
535
+            self.register_hook(event, hooks[event])
536
+
537
+
538
+class Response(object):
539
+    """The :class:`Response <Response>` object, which contains a
540
+    server's response to an HTTP request.
541
+    """
542
+
543
+    __attrs__ = [
544
+        '_content', 'status_code', 'headers', 'url', 'history',
545
+        'encoding', 'reason', 'cookies', 'elapsed', 'request'
546
+    ]
547
+
548
+    def __init__(self):
549
+        super(Response, self).__init__()
550
+
551
+        self._content = False
552
+        self._content_consumed = False
553
+
554
+        #: Integer Code of responded HTTP Status, e.g. 404 or 200.
555
+        self.status_code = None
556
+
557
+        #: Case-insensitive Dictionary of Response Headers.
558
+        #: For example, ``headers['content-encoding']`` will return the
559
+        #: value of a ``'Content-Encoding'`` response header.
560
+        self.headers = CaseInsensitiveDict()
561
+
562
+        #: File-like object representation of response (for advanced usage).
563
+        #: Use of ``raw`` requires that ``stream=True`` be set on the request.
564
+        # This requirement does not apply for use internally to Requests.
565
+        self.raw = None
566
+
567
+        #: Final URL location of Response.
568
+        self.url = None
569
+
570
+        #: Encoding to decode with when accessing r.text.
571
+        self.encoding = None
572
+
573
+        #: A list of :class:`Response <Response>` objects from
574
+        #: the history of the Request. Any redirect responses will end
575
+        #: up here. The list is sorted from the oldest to the most recent request.
576
+        self.history = []
577
+
578
+        #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK".
579
+        self.reason = None
580
+
581
+        #: A CookieJar of Cookies the server sent back.
582
+        self.cookies = cookiejar_from_dict({})
583
+
584
+        #: The amount of time elapsed between sending the request
585
+        #: and the arrival of the response (as a timedelta).
586
+        #: This property specifically measures the time taken between sending
587
+        #: the first byte of the request and finishing parsing the headers. It
588
+        #: is therefore unaffected by consuming the response content or the
589
+        #: value of the ``stream`` keyword argument.
590
+        self.elapsed = datetime.timedelta(0)
591
+
592
+        #: The :class:`PreparedRequest <PreparedRequest>` object to which this
593
+        #: is a response.
594
+        self.request = None
595
+
596
+    def __getstate__(self):
597
+        # Consume everything; accessing the content attribute makes
598
+        # sure the content has been fully read.
599
+        if not self._content_consumed:
600
+            self.content
601
+
602
+        return dict(
603
+            (attr, getattr(self, attr, None))
604
+            for attr in self.__attrs__
605
+        )
606
+
607
+    def __setstate__(self, state):
608
+        for name, value in state.items():
609
+            setattr(self, name, value)
610
+
611
+        # pickled objects do not have .raw
612
+        setattr(self, '_content_consumed', True)
613
+        setattr(self, 'raw', None)
614
+
615
+    def __repr__(self):
616
+        return '<Response [%s]>' % (self.status_code)
617
+
618
+    def __bool__(self):
619
+        """Returns true if :attr:`status_code` is 'OK'."""
620
+        return self.ok
621
+
622
+    def __nonzero__(self):
623
+        """Returns true if :attr:`status_code` is 'OK'."""
624
+        return self.ok
625
+
626
+    def __iter__(self):
627
+        """Allows you to use a response as an iterator."""
628
+        return self.iter_content(128)
629
+
630
+    @property
631
+    def ok(self):
632
+        try:
633
+            self.raise_for_status()
634
+        except HTTPError:
635
+            return False
636
+        return True
637
+
638
+    @property
639
+    def is_redirect(self):
640
+        """True if this Response is a well-formed HTTP redirect that could have
641
+        been processed automatically (by :meth:`Session.resolve_redirects`).
642
+        """
643
+        return ('location' in self.headers and self.status_code in REDIRECT_STATI)
644
+
645
+    @property
646
+    def is_permanent_redirect(self):
647
+        """True if this Response one of the permanent versions of redirect"""
648
+        return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect))
649
+
650
+    @property
651
+    def apparent_encoding(self):
652
+        """The apparent encoding, provided by the chardet library"""
653
+        return chardet.detect(self.content)['encoding']
654
+
655
+    def iter_content(self, chunk_size=1, decode_unicode=False):
656
+        """Iterates over the response data.  When stream=True is set on the
657
+        request, this avoids reading the content at once into memory for
658
+        large responses.  The chunk size is the number of bytes it should
659
+        read into memory.  This is not necessarily the length of each item
660
+        returned as decoding can take place.
661
+
662
+        chunk_size must be of type int or None. A value of None will
663
+        function differently depending on the value of `stream`.
664
+        stream=True will read data as it arrives in whatever size the
665
+        chunks are received. If stream=False, data is returned as
666
+        a single chunk.
667
+
668
+        If decode_unicode is True, content will be decoded using the best
669
+        available encoding based on the response.
670
+        """
671
+
672
+        def generate():
673
+            # Special case for urllib3.
674
+            if hasattr(self.raw, 'stream'):
675
+                try:
676
+                    for chunk in self.raw.stream(chunk_size, decode_content=True):
677
+                        yield chunk
678
+                except ProtocolError as e:
679
+                    raise ChunkedEncodingError(e)
680
+                except DecodeError as e:
681
+                    raise ContentDecodingError(e)
682
+                except ReadTimeoutError as e:
683
+                    raise ConnectionError(e)
684
+            else:
685
+                # Standard file-like object.
686
+                while True:
687
+                    chunk = self.raw.read(chunk_size)
688
+                    if not chunk:
689
+                        break
690
+                    yield chunk
691
+
692
+            self._content_consumed = True
693
+
694
+        if self._content_consumed and isinstance(self._content, bool):
695
+            raise StreamConsumedError()
696
+        elif chunk_size is not None and not isinstance(chunk_size, int):
697
+            raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size))
698
+        # simulate reading small chunks of the content
699
+        reused_chunks = iter_slices(self._content, chunk_size)
700
+
701
+        stream_chunks = generate()
702
+
703
+        chunks = reused_chunks if self._content_consumed else stream_chunks
704
+
705
+        if decode_unicode:
706
+            chunks = stream_decode_response_unicode(chunks, self)
707
+
708
+        return chunks
709
+
710
+    def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None):
711
+        """Iterates over the response data, one line at a time.  When
712
+        stream=True is set on the request, this avoids reading the
713
+        content at once into memory for large responses.
714
+
715
+        .. note:: This method is not reentrant safe.
716
+        """
717
+
718
+        pending = None
719
+
720
+        for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode):
721
+
722
+            if pending is not None:
723
+                chunk = pending + chunk
724
+
725
+            if delimiter:
726
+                lines = chunk.split(delimiter)
727
+            else:
728
+                lines = chunk.splitlines()
729
+
730
+            if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]:
731
+                pending = lines.pop()
732
+            else:
733
+                pending = None
734
+
735
+            for line in lines:
736
+                yield line
737
+
738
+        if pending is not None:
739
+            yield pending
740
+
741
+    @property
742
+    def content(self):
743
+        """Content of the response, in bytes."""
744
+
745
+        if self._content is False:
746
+            # Read the contents.
747
+            try:
748
+                if self._content_consumed:
749
+                    raise RuntimeError(
750
+                        'The content for this response was already consumed')
751
+
752
+                if self.status_code == 0:
753
+                    self._content = None
754
+                else:
755
+                    self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes()
756
+
757
+            except AttributeError:
758
+                self._content = None
759
+
760
+        self._content_consumed = True
761
+        # don't need to release the connection; that's been handled by urllib3
762
+        # since we exhausted the data.
763
+        return self._content
764
+
765
+    @property
766
+    def text(self):
767
+        """Content of the response, in unicode.
768
+
769
+        If Response.encoding is None, encoding will be guessed using
770
+        ``chardet``.
771
+
772
+        The encoding of the response content is determined based solely on HTTP
773
+        headers, following RFC 2616 to the letter. If you can take advantage of
774
+        non-HTTP knowledge to make a better guess at the encoding, you should
775
+        set ``r.encoding`` appropriately before accessing this property.
776
+        """
777
+
778
+        # Try charset from content-type
779
+        content = None
780
+        encoding = self.encoding
781
+
782
+        if not self.content:
783
+            return str('')
784
+
785
+        # Fallback to auto-detected encoding.
786
+        if self.encoding is None:
787
+            encoding = self.apparent_encoding
788
+
789
+        # Decode unicode from given encoding.
790
+        try:
791
+            content = str(self.content, encoding, errors='replace')
792
+        except (LookupError, TypeError):
793
+            # A LookupError is raised if the encoding was not found which could
794
+            # indicate a misspelling or similar mistake.
795
+            #
796
+            # A TypeError can be raised if encoding is None
797
+            #
798
+            # So we try blindly encoding.
799
+            content = str(self.content, errors='replace')
800
+
801
+        return content
802
+
803
+    def json(self, **kwargs):
804
+        """Returns the json-encoded content of a response, if any.
805
+
806
+        :param \*\*kwargs: Optional arguments that ``json.loads`` takes.
807
+        """
808
+
809
+        if not self.encoding and self.content and len(self.content) > 3:
810
+            # No encoding set. JSON RFC 4627 section 3 states we should expect
811
+            # UTF-8, -16 or -32. Detect which one to use; If the detection or
812
+            # decoding fails, fall back to `self.text` (using chardet to make
813
+            # a best guess).
814
+            encoding = guess_json_utf(self.content)
815
+            if encoding is not None:
816
+                try:
817
+                    return complexjson.loads(
818
+                        self.content.decode(encoding), **kwargs
819
+                    )
820
+                except UnicodeDecodeError:
821
+                    # Wrong UTF codec detected; usually because it's not UTF-8
822
+                    # but some other 8-bit codec.  This is an RFC violation,
823
+                    # and the server didn't bother to tell us what codec *was*
824
+                    # used.
825
+                    pass
826
+        return complexjson.loads(self.text, **kwargs)
827
+
828
+    @property
829
+    def links(self):
830
+        """Returns the parsed header links of the response, if any."""
831
+
832
+        header = self.headers.get('link')
833
+
834
+        # l = MultiDict()
835
+        l = {}
836
+
837
+        if header:
838
+            links = parse_header_links(header)
839
+
840
+            for link in links:
841
+                key = link.get('rel') or link.get('url')
842
+                l[key] = link
843
+
844
+        return l
845
+
846
+    def raise_for_status(self):
847
+        """Raises stored :class:`HTTPError`, if one occurred."""
848
+
849
+        http_error_msg = ''
850
+        if isinstance(self.reason, bytes):
851
+            reason = self.reason.decode('utf-8', 'ignore')
852
+        else:
853
+            reason = self.reason
854
+
855
+        if 400 <= self.status_code < 500:
856
+            http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url)
857
+
858
+        elif 500 <= self.status_code < 600:
859
+            http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url)
860
+
861
+        if http_error_msg:
862
+            raise HTTPError(http_error_msg, response=self)
863
+
864
+    def close(self):
865
+        """Releases the connection back to the pool. Once this method has been
866
+        called the underlying ``raw`` object must not be accessed again.
867
+
868
+        *Note: Should not normally need to be called explicitly.*
869
+        """
870
+        if not self._content_consumed:
871
+            self.raw.close()
872
+
873
+        return self.raw.release_conn()

+ 36
- 0
Contents/Libraries/Shared/requests/packages/__init__.py View File

1
+'''
2
+Debian and other distributions "unbundle" requests' vendored dependencies, and
3
+rewrite all imports to use the global versions of ``urllib3`` and ``chardet``.
4
+The problem with this is that not only requests itself imports those
5
+dependencies, but third-party code outside of the distros' control too.
6
+
7
+In reaction to these problems, the distro maintainers replaced
8
+``requests.packages`` with a magical "stub module" that imports the correct
9
+modules. The implementations were varying in quality and all had severe
10
+problems. For example, a symlink (or hardlink) that links the correct modules
11
+into place introduces problems regarding object identity, since you now have
12
+two modules in `sys.modules` with the same API, but different identities::
13
+
14
+    requests.packages.urllib3 is not urllib3
15
+
16
+With version ``2.5.2``, requests started to maintain its own stub, so that
17
+distro-specific breakage would be reduced to a minimum, even though the whole
18
+issue is not requests' fault in the first place. See
19
+https://github.com/kennethreitz/requests/pull/2375 for the corresponding pull
20
+request.
21
+'''
22
+
23
+from __future__ import absolute_import
24
+import sys
25
+
26
+try:
27
+    from . import urllib3
28
+except ImportError:
29
+    import urllib3
30
+    sys.modules['%s.urllib3' % __name__] = urllib3
31
+
32
+try:
33
+    from . import chardet
34
+except ImportError:
35
+    import chardet
36
+    sys.modules['%s.chardet' % __name__] = chardet

+ 32
- 0
Contents/Libraries/Shared/requests/packages/chardet/__init__.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# This library is free software; you can redistribute it and/or
3
+# modify it under the terms of the GNU Lesser General Public
4
+# License as published by the Free Software Foundation; either
5
+# version 2.1 of the License, or (at your option) any later version.
6
+#
7
+# This library is distributed in the hope that it will be useful,
8
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10
+# Lesser General Public License for more details.
11
+#
12
+# You should have received a copy of the GNU Lesser General Public
13
+# License along with this library; if not, write to the Free Software
14
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
15
+# 02110-1301  USA
16
+######################### END LICENSE BLOCK #########################
17
+
18
+__version__ = "2.3.0"
19
+from sys import version_info
20
+
21
+
22
+def detect(aBuf):
23
+    if ((version_info < (3, 0) and isinstance(aBuf, unicode)) or
24
+            (version_info >= (3, 0) and not isinstance(aBuf, bytes))):
25
+        raise ValueError('Expected a bytes object, not a unicode object')
26
+
27
+    from . import universaldetector
28
+    u = universaldetector.UniversalDetector()
29
+    u.reset()
30
+    u.feed(aBuf)
31
+    u.close()
32
+    return u.result

+ 925
- 0
Contents/Libraries/Shared/requests/packages/chardet/big5freq.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+# Big5 frequency table
29
+# by Taiwan's Mandarin Promotion Council
30
+# <http://www.edu.tw:81/mandr/>
31
+#
32
+# 128  --> 0.42261
33
+# 256  --> 0.57851
34
+# 512  --> 0.74851
35
+# 1024 --> 0.89384
36
+# 2048 --> 0.97583
37
+#
38
+# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98
39
+# Random Distribution Ration = 512/(5401-512)=0.105
40
+#
41
+# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
42
+
43
+BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75
44
+
45
+#Char to FreqOrder table
46
+BIG5_TABLE_SIZE = 5376
47
+
48
+Big5CharToFreqOrder = (
49
+   1,1801,1506, 255,1431, 198,   9,  82,   6,5008, 177, 202,3681,1256,2821, 110, #   16
50
+3814,  33,3274, 261,  76,  44,2114,  16,2946,2187,1176, 659,3971,  26,3451,2653, #   32
51
+1198,3972,3350,4202, 410,2215, 302, 590, 361,1964,   8, 204,  58,4510,5009,1932, #   48
52
+  63,5010,5011, 317,1614,  75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, #   64
53
+3682,   3,  10,3973,1471,  29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, #   80
54
+4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947,  34,3556,3204,  64, 604, #   96
55
+5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337,  72, 406,5017,  80, #  112
56
+ 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449,  69,2987, 591, #  128
57
+ 179,2096, 471, 115,2035,1844,  60,  50,2988, 134, 806,1869, 734,2036,3454, 180, #  144
58
+ 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, #  160
59
+2502,  90,2716,1338, 663,  11, 906,1099,2553,  20,2441, 182, 532,1716,5019, 732, #  176
60
+1376,4204,1311,1420,3206,  25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, #  192
61
+3276, 475,1447,3683,5020, 117,  21, 656, 810,1297,2300,2334,3557,5021, 126,4205, #  208
62
+ 706, 456, 150, 613,4513,  71,1118,2037,4206, 145,3092,  85, 835, 486,2115,1246, #  224
63
+1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, #  240
64
+3558,3135,5023,1956,1153,4207,  83, 296,1199,3093, 192, 624,  93,5024, 822,1898, #  256
65
+2823,3136, 795,2065, 991,1554,1542,1592,  27,  43,2867, 859, 139,1456, 860,4514, #  272
66
+ 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, #  288
67
+3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, #  304
68
+1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, #  320
69
+5026,5027,2176,3207,3685,2682, 593, 845,1062,3277,  88,1723,2038,3978,1951, 212, #  336
70
+ 266, 152, 149, 468,1899,4208,4516,  77, 187,5028,3038,  37,   5,2990,5029,3979, #  352
71
+5030,5031,  39,2524,4517,2908,3208,2079,  55, 148,  74,4518, 545, 483,1474,1029, #  368
72
+1665, 217,1870,1531,3138,1104,2655,4209,  24, 172,3562, 900,3980,3563,3564,4519, #  384
73
+  32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683,   4,3039,3351,1427,1789, #  400
74
+ 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, #  416
75
+3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439,  38,5037,1063,5038, 794, #  432
76
+3982,1435,2301,  46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804,  35, 707, #  448
77
+ 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, #  464
78
+2129,1363,3689,1423, 697, 100,3094,  48,  70,1231, 495,3139,2196,5043,1294,5044, #  480
79
+2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, #  496
80
+ 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, #  512
81
+ 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, #  528
82
+3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, #  544
83
+1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, #  560
84
+1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, #  576
85
+1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381,   7, #  592
86
+2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, #  608
87
+ 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, #  624
88
+4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, #  640
89
+1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, #  656
90
+5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, #  672
91
+2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, #  688
92
+ 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, #  704
93
+  98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, #  720
94
+ 523,2789,2790,2658,5061, 141,2235,1333,  68, 176, 441, 876, 907,4220, 603,2602, #  736
95
+ 710, 171,3464, 404, 549,  18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, #  752
96
+5063,2991, 368,5064, 146, 366,  99, 871,3693,1543, 748, 807,1586,1185,  22,2263, #  768
97
+ 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, #  784
98
+1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068,  59,5069, #  800
99
+ 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, #  816
100
+ 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, #  832
101
+5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, #  848
102
+1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, #  864
103
+ 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, #  880
104
+3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, #  896
105
+4224,  57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, #  912
106
+3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, #  928
107
+ 279,3145,  51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, #  944
108
+ 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, #  960
109
+1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, #  976
110
+4227,2475,1436, 953,4228,2055,4545, 671,2400,  79,4229,2446,3285, 608, 567,2689, #  992
111
+3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008
112
+3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024
113
+2402,5097,5098,5099,4232,3045,   0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040
114
+5101, 233,4233,3697,1819,4550,4551,5102,  96,1777,1315,2083,5103, 257,5104,1810, # 1056
115
+3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072
116
+5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088
117
+1484,5110,1712, 127,  67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104
118
+2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120
119
+1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136
120
+  78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152
121
+1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168
122
+4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184
123
+3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200
124
+ 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216
125
+ 165, 243,4559,3703,2528, 123, 683,4239, 764,4560,  36,3998,1793, 589,2916, 816, # 1232
126
+ 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248
127
+2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264
128
+5122, 611,1156, 854,2386,1316,2875,   2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280
129
+1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296
130
+2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312
131
+1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328
132
+1994,5135,4564,5136,5137,2198,  13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344
133
+5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360
134
+5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376
135
+5149, 128,2133,  92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392
136
+3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408
137
+4567,2252,  94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424
138
+4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440
139
+2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456
140
+5163,2337,2068,  23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472
141
+3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488
142
+ 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504
143
+5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863,  41, # 1520
144
+5170,5171,4575,5172,1657,2338,  19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536
145
+1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552
146
+2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568
147
+3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584
148
+4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600
149
+5182,2692, 733,  40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616
150
+3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632
151
+4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648
152
+1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664
153
+1871,2762,3004,5187, 435,5188, 343,1108, 596,  17,1751,4579,2239,3477,3709,5189, # 1680
154
+4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696
155
+1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712
156
+ 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728
157
+1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744
158
+1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760
159
+3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776
160
+ 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792
161
+5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808
162
+2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824
163
+1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840
164
+1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551,  30,2268,4266, # 1856
165
+5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872
166
+ 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888
167
+4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904
168
+ 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920
169
+2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936
170
+ 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952
171
+1041,3005, 293,1168,  87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968
172
+1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984
173
+ 730,1515, 184,2840,  66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000
174
+4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016
175
+4021,5231,5232,1186,  15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032
176
+1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048
177
+3596,1342,1681,1718, 766,3297, 286,  89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064
178
+5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080
179
+5240,3298, 310, 313,3482,2304, 770,4278,  54,3054, 189,4611,3105,3848,4025,5241, # 2096
180
+1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112
181
+2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128
182
+1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144
183
+3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160
184
+2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176
185
+3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192
186
+2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208
187
+4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224
188
+4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240
189
+3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256
190
+  97,  81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272
191
+3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288
192
+ 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304
193
+3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320
194
+4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336
195
+3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352
196
+1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368
197
+5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384
198
+ 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400
199
+5286, 587,  14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416
200
+1702,1226, 102,1547,  62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432
201
+ 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448
202
+4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294,  86,1494,1730, # 2464
203
+4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480
204
+ 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496
205
+2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512
206
+2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885,  28,2695, # 2528
207
+3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544
208
+1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560
209
+4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576
210
+2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592
211
+1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608
212
+1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624
213
+2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640
214
+3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656
215
+1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672
216
+5313,3493,5314,5315,5316,3310,2698,1433,3311, 131,  95,1504,4049, 723,4303,3166, # 2688
217
+1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704
218
+4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654,  53,5320,3014,5321, # 2720
219
+1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736
220
+ 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752
221
+1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768
222
+4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784
223
+4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800
224
+2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816
225
+1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832
226
+4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848
227
+ 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864
228
+5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880
229
+2322,3316,5346,5347,4308,5348,4309,  84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896
230
+3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912
231
+4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928
232
+ 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944
233
+5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960
234
+5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976
235
+1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992
236
+4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008
237
+4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024
238
+2699,1516,3614,1121,1082,1329,3317,4073,1449,3873,  65,1128,2848,2927,2769,1590, # 3040
239
+3874,5370,5371,  12,2668,  45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056
240
+3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072
241
+2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088
242
+1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104
243
+4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120
244
+3736,1859,  91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136
245
+3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152
246
+2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168
247
+4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771,  61,4079,3738,1823,4080, # 3184
248
+5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200
249
+3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216
250
+2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232
251
+3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248
252
+1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264
253
+2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280
254
+3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296
255
+4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063,  56,1396,3113, # 3312
256
+2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328
257
+2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344
258
+5418,1076,  49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360
259
+1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376
260
+2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392
261
+1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408
262
+3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424
263
+4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629,  31,2851, # 3440
264
+2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456
265
+3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472
266
+3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488
267
+2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504
268
+4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520
269
+2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536
270
+3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552
271
+4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568
272
+5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584
273
+3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600
274
+ 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616
275
+1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412,  42,3119, 464,5455,2642, # 3632
276
+4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648
277
+1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664
278
+4701,5462,3020, 962, 588,3629, 289,3250,2644,1116,  52,5463,3067,1797,5464,5465, # 3680
279
+5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696
280
+ 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712
281
+5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728
282
+5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744
283
+2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760
284
+3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776
285
+2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792
286
+2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808
287
+ 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824
288
+1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840
289
+4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856
290
+3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872
291
+3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888
292
+ 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904
293
+2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920
294
+ 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936
295
+2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952
296
+4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968
297
+1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984
298
+4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000
299
+1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016
300
+3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032
301
+ 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048
302
+3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064
303
+5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080
304
+5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096
305
+3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112
306
+3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128
307
+1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144
308
+2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160
309
+5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176
310
+1561,2674,1452,4113,1375,5549,5550,  47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192
311
+1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208
312
+3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224
313
+ 919,2352,2975,2353,1270,4727,4115,  73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240
314
+1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256
315
+4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272
316
+5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288
317
+2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304
318
+3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320
319
+ 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336
320
+1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352
321
+2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368
322
+2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384
323
+5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400
324
+5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416
325
+5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432
326
+2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448
327
+2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464
328
+1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480
329
+4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496
330
+3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512
331
+3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528
332
+4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544
333
+4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560
334
+2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576
335
+2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592
336
+5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608
337
+4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624
338
+5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640
339
+4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656
340
+ 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672
341
+ 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688
342
+1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704
343
+3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720
344
+4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736
345
+1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752
346
+5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768
347
+2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784
348
+2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800
349
+3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816
350
+5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832
351
+1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848
352
+3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864
353
+5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880
354
+1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896
355
+5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912
356
+2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928
357
+3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944
358
+2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960
359
+3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976
360
+3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992
361
+3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008
362
+4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024
363
+ 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040
364
+2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056
365
+4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072
366
+3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088
367
+5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104
368
+1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120
369
+5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136
370
+ 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152
371
+1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168
372
+ 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184
373
+4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200
374
+1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216
375
+4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232
376
+1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248
377
+ 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264
378
+3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280
379
+4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296
380
+5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312
381
+ 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328
382
+3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344
383
+ 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360
384
+2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376  #last 512
385
+#Everything below is of no interest for detection purpose
386
+2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392
387
+2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408
388
+5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424
389
+5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440
390
+5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456
391
+5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472
392
+5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488
393
+5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504
394
+5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520
395
+5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536
396
+5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552
397
+5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568
398
+5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584
399
+5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600
400
+6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616
401
+6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632
402
+6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648
403
+6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664
404
+6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680
405
+6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696
406
+6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712
407
+6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728
408
+6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744
409
+6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760
410
+6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776
411
+6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792
412
+6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808
413
+6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824
414
+6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840
415
+6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856
416
+6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872
417
+6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888
418
+6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904
419
+6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920
420
+6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936
421
+6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952
422
+6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968
423
+6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984
424
+6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000
425
+6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016
426
+6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032
427
+6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048
428
+6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064
429
+6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080
430
+6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096
431
+6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112
432
+6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128
433
+6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144
434
+6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160
435
+6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176
436
+6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192
437
+6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208
438
+6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224
439
+6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240
440
+6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256
441
+3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272
442
+6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288
443
+6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304
444
+3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320
445
+6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336
446
+6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352
447
+6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368
448
+6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384
449
+6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400
450
+6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416
451
+6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432
452
+4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448
453
+6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464
454
+6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480
455
+3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496
456
+6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512
457
+6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528
458
+6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544
459
+6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560
460
+6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576
461
+6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592
462
+6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608
463
+6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624
464
+6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640
465
+6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656
466
+6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672
467
+7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688
468
+7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704
469
+7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720
470
+7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736
471
+7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752
472
+7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768
473
+7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784
474
+7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800
475
+7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816
476
+7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832
477
+7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848
478
+7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864
479
+7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880
480
+7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896
481
+7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912
482
+7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928
483
+7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944
484
+7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960
485
+7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976
486
+7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992
487
+7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008
488
+7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024
489
+7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040
490
+7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056
491
+7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072
492
+7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088
493
+7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104
494
+7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120
495
+7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136
496
+7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152
497
+7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168
498
+7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184
499
+7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200
500
+7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216
501
+7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232
502
+7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248
503
+7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264
504
+7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280
505
+7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296
506
+7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312
507
+7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328
508
+7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344
509
+7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360
510
+7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376
511
+7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392
512
+7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408
513
+7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424
514
+7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440
515
+3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456
516
+7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472
517
+7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488
518
+7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504
519
+7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520
520
+4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536
521
+7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552
522
+7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568
523
+7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584
524
+7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600
525
+7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616
526
+7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632
527
+7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648
528
+7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664
529
+7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680
530
+7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696
531
+7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712
532
+8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728
533
+8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744
534
+8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760
535
+8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776
536
+8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792
537
+8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808
538
+8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824
539
+8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840
540
+8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856
541
+8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872
542
+8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888
543
+8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904
544
+8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920
545
+8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936
546
+8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952
547
+8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968
548
+8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984
549
+8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000
550
+8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016
551
+8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032
552
+8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048
553
+8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064
554
+8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080
555
+8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096
556
+8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112
557
+8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128
558
+8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144
559
+8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160
560
+8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176
561
+8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192
562
+8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208
563
+8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224
564
+8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240
565
+8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256
566
+8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272
567
+8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288
568
+8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304
569
+8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320
570
+8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336
571
+8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352
572
+8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368
573
+8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384
574
+8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400
575
+8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416
576
+8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432
577
+8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448
578
+8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464
579
+8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480
580
+8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496
581
+8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512
582
+8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528
583
+8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544
584
+8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560
585
+8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576
586
+8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592
587
+8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608
588
+8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624
589
+8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640
590
+8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656
591
+8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672
592
+8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688
593
+4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704
594
+8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720
595
+8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736
596
+8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752
597
+8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768
598
+9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784
599
+9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800
600
+9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816
601
+9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832
602
+9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848
603
+9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864
604
+9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880
605
+9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896
606
+9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912
607
+9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928
608
+9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944
609
+9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960
610
+9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976
611
+9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992
612
+9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008
613
+9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024
614
+9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040
615
+9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056
616
+9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072
617
+9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088
618
+9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104
619
+9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120
620
+9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136
621
+9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152
622
+9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168
623
+9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184
624
+9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200
625
+9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216
626
+9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232
627
+9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248
628
+9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264
629
+9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280
630
+9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296
631
+9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312
632
+9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328
633
+9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344
634
+9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360
635
+9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376
636
+3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392
637
+9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408
638
+9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424
639
+9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440
640
+4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456
641
+9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472
642
+9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488
643
+9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504
644
+9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520
645
+9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536
646
+9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552
647
+9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568
648
+9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584
649
+9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600
650
+9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616
651
+9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632
652
+9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648
653
+9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664
654
+9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680
655
+9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696
656
+9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712
657
+9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728
658
+9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744
659
+9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760
660
+9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776
661
+9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792
662
+9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808
663
+9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824
664
+10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840
665
+10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856
666
+10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872
667
+10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888
668
+10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904
669
+10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920
670
+10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936
671
+10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952
672
+10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968
673
+4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984
674
+10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000
675
+10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016
676
+10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032
677
+10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048
678
+10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064
679
+10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080
680
+10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096
681
+10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112
682
+4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128
683
+10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144
684
+10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160
685
+10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176
686
+10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192
687
+10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208
688
+10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224
689
+10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240
690
+10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256
691
+10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272
692
+10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288
693
+10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304
694
+10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320
695
+10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336
696
+10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352
697
+10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368
698
+10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384
699
+10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400
700
+4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416
701
+10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432
702
+10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448
703
+10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464
704
+10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480
705
+10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496
706
+10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512
707
+10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528
708
+10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544
709
+10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560
710
+10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576
711
+10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592
712
+10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608
713
+10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624
714
+10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640
715
+10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656
716
+10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672
717
+10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688
718
+10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704
719
+10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720
720
+10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736
721
+10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752
722
+10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768
723
+10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784
724
+10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800
725
+10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816
726
+10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832
727
+10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848
728
+10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864
729
+10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880
730
+10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896
731
+11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912
732
+11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928
733
+11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944
734
+4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960
735
+11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976
736
+11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992
737
+11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008
738
+11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024
739
+11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040
740
+11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056
741
+11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072
742
+11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088
743
+11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104
744
+11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120
745
+11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136
746
+11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152
747
+11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168
748
+11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184
749
+11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200
750
+11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216
751
+11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232
752
+11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248
753
+11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264
754
+11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280
755
+11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296
756
+11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312
757
+11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328
758
+11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344
759
+11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360
760
+11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376
761
+11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392
762
+11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408
763
+11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424
764
+11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440
765
+11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456
766
+11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472
767
+4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488
768
+11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504
769
+11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520
770
+11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536
771
+11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552
772
+11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568
773
+11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584
774
+11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600
775
+11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616
776
+11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632
777
+11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648
778
+11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664
779
+11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680
780
+11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696
781
+11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712
782
+11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728
783
+11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744
784
+11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760
785
+11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776
786
+11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792
787
+11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808
788
+11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824
789
+11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840
790
+11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856
791
+11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872
792
+11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888
793
+11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904
794
+11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920
795
+11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936
796
+12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952
797
+12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968
798
+12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984
799
+12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000
800
+12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016
801
+12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032
802
+12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048
803
+12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064
804
+12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080
805
+12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096
806
+12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112
807
+12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128
808
+12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144
809
+12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160
810
+12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176
811
+4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192
812
+4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208
813
+4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224
814
+12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240
815
+12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256
816
+12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272
817
+12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288
818
+12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304
819
+12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320
820
+12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336
821
+12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352
822
+12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368
823
+12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384
824
+12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400
825
+12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416
826
+12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432
827
+12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448
828
+12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464
829
+12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480
830
+12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496
831
+12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512
832
+12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528
833
+12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544
834
+12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560
835
+12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576
836
+12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592
837
+12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608
838
+12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624
839
+12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640
840
+12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656
841
+12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672
842
+12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688
843
+12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704
844
+12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720
845
+12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736
846
+12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752
847
+12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768
848
+12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784
849
+12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800
850
+12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816
851
+12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832
852
+12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848
853
+12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864
854
+12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880
855
+12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896
856
+12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912
857
+12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928
858
+12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944
859
+12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960
860
+12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976
861
+4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992
862
+13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008
863
+13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024
864
+13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040
865
+13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056
866
+13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072
867
+13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088
868
+13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104
869
+4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120
870
+13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136
871
+13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152
872
+13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168
873
+13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184
874
+13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200
875
+13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216
876
+13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232
877
+13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248
878
+13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264
879
+13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280
880
+13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296
881
+13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312
882
+13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328
883
+13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344
884
+13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360
885
+5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376
886
+13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392
887
+13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408
888
+13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424
889
+13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440
890
+13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456
891
+13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472
892
+13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488
893
+13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504
894
+13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520
895
+13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536
896
+13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552
897
+13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568
898
+13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584
899
+13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600
900
+13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616
901
+13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632
902
+13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648
903
+13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664
904
+13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680
905
+13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696
906
+13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712
907
+13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728
908
+13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744
909
+13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760
910
+13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776
911
+13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792
912
+13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808
913
+13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824
914
+13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840
915
+13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856
916
+13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872
917
+13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888
918
+13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904
919
+13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920
920
+13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936
921
+13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952
922
+13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968
923
+13968,13969,13970,13971,13972) #13973
924
+
925
+# flake8: noqa

+ 42
- 0
Contents/Libraries/Shared/requests/packages/chardet/big5prober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from .mbcharsetprober import MultiByteCharSetProber
29
+from .codingstatemachine import CodingStateMachine
30
+from .chardistribution import Big5DistributionAnalysis
31
+from .mbcssm import Big5SMModel
32
+
33
+
34
+class Big5Prober(MultiByteCharSetProber):
35
+    def __init__(self):
36
+        MultiByteCharSetProber.__init__(self)
37
+        self._mCodingSM = CodingStateMachine(Big5SMModel)
38
+        self._mDistributionAnalyzer = Big5DistributionAnalysis()
39
+        self.reset()
40
+
41
+    def get_charset_name(self):
42
+        return "Big5"

+ 80
- 0
Contents/Libraries/Shared/requests/packages/chardet/chardetect.py View File

1
+#!/usr/bin/env python
2
+"""
3
+Script which takes one or more file paths and reports on their detected
4
+encodings
5
+
6
+Example::
7
+
8
+    % chardetect somefile someotherfile
9
+    somefile: windows-1252 with confidence 0.5
10
+    someotherfile: ascii with confidence 1.0
11
+
12
+If no paths are provided, it takes its input from stdin.
13
+
14
+"""
15
+
16
+from __future__ import absolute_import, print_function, unicode_literals
17
+
18
+import argparse
19
+import sys
20
+from io import open
21
+
22
+from chardet import __version__
23
+from chardet.universaldetector import UniversalDetector
24
+
25
+
26
+def description_of(lines, name='stdin'):
27
+    """
28
+    Return a string describing the probable encoding of a file or
29
+    list of strings.
30
+
31
+    :param lines: The lines to get the encoding of.
32
+    :type lines: Iterable of bytes
33
+    :param name: Name of file or collection of lines
34
+    :type name: str
35
+    """
36
+    u = UniversalDetector()
37
+    for line in lines:
38
+        u.feed(line)
39
+    u.close()
40
+    result = u.result
41
+    if result['encoding']:
42
+        return '{0}: {1} with confidence {2}'.format(name, result['encoding'],
43
+                                                     result['confidence'])
44
+    else:
45
+        return '{0}: no result'.format(name)
46
+
47
+
48
+def main(argv=None):
49
+    '''
50
+    Handles command line arguments and gets things started.
51
+
52
+    :param argv: List of arguments, as if specified on the command-line.
53
+                 If None, ``sys.argv[1:]`` is used instead.
54
+    :type argv: list of str
55
+    '''
56
+    # Get command line arguments
57
+    parser = argparse.ArgumentParser(
58
+        description="Takes one or more file paths and reports their detected \
59
+                     encodings",
60
+        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
61
+        conflict_handler='resolve')
62
+    parser.add_argument('input',
63
+                        help='File whose encoding we would like to determine.',
64
+                        type=argparse.FileType('rb'), nargs='*',
65
+                        default=[sys.stdin])
66
+    parser.add_argument('--version', action='version',
67
+                        version='%(prog)s {0}'.format(__version__))
68
+    args = parser.parse_args(argv)
69
+
70
+    for f in args.input:
71
+        if f.isatty():
72
+            print("You are running chardetect interactively. Press " +
73
+                  "CTRL-D twice at the start of a blank line to signal the " +
74
+                  "end of your input. If you want help, run chardetect " +
75
+                  "--help\n", file=sys.stderr)
76
+        print(description_of(f, f.name))
77
+
78
+
79
+if __name__ == '__main__':
80
+    main()

+ 231
- 0
Contents/Libraries/Shared/requests/packages/chardet/chardistribution.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE,
29
+                        EUCTW_TYPICAL_DISTRIBUTION_RATIO)
30
+from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE,
31
+                        EUCKR_TYPICAL_DISTRIBUTION_RATIO)
32
+from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE,
33
+                         GB2312_TYPICAL_DISTRIBUTION_RATIO)
34
+from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE,
35
+                       BIG5_TYPICAL_DISTRIBUTION_RATIO)
36
+from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE,
37
+                      JIS_TYPICAL_DISTRIBUTION_RATIO)
38
+from .compat import wrap_ord
39
+
40
+ENOUGH_DATA_THRESHOLD = 1024
41
+SURE_YES = 0.99
42
+SURE_NO = 0.01
43
+MINIMUM_DATA_THRESHOLD = 3
44
+
45
+
46
+class CharDistributionAnalysis:
47
+    def __init__(self):
48
+        # Mapping table to get frequency order from char order (get from
49
+        # GetOrder())
50
+        self._mCharToFreqOrder = None
51
+        self._mTableSize = None  # Size of above table
52
+        # This is a constant value which varies from language to language,
53
+        # used in calculating confidence.  See
54
+        # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
55
+        # for further detail.
56
+        self._mTypicalDistributionRatio = None
57
+        self.reset()
58
+
59
+    def reset(self):
60
+        """reset analyser, clear any state"""
61
+        # If this flag is set to True, detection is done and conclusion has
62
+        # been made
63
+        self._mDone = False
64
+        self._mTotalChars = 0  # Total characters encountered
65
+        # The number of characters whose frequency order is less than 512
66
+        self._mFreqChars = 0
67
+
68
+    def feed(self, aBuf, aCharLen):
69
+        """feed a character with known length"""
70
+        if aCharLen == 2:
71
+            # we only care about 2-bytes character in our distribution analysis
72
+            order = self.get_order(aBuf)
73
+        else:
74
+            order = -1
75
+        if order >= 0:
76
+            self._mTotalChars += 1
77
+            # order is valid
78
+            if order < self._mTableSize:
79
+                if 512 > self._mCharToFreqOrder[order]:
80
+                    self._mFreqChars += 1
81
+
82
+    def get_confidence(self):
83
+        """return confidence based on existing data"""
84
+        # if we didn't receive any character in our consideration range,
85
+        # return negative answer
86
+        if self._mTotalChars <= 0 or self._mFreqChars <= MINIMUM_DATA_THRESHOLD:
87
+            return SURE_NO
88
+
89
+        if self._mTotalChars != self._mFreqChars:
90
+            r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars)
91
+                 * self._mTypicalDistributionRatio))
92
+            if r < SURE_YES:
93
+                return r
94
+
95
+        # normalize confidence (we don't want to be 100% sure)
96
+        return SURE_YES
97
+
98
+    def got_enough_data(self):
99
+        # It is not necessary to receive all data to draw conclusion.
100
+        # For charset detection, certain amount of data is enough
101
+        return self._mTotalChars > ENOUGH_DATA_THRESHOLD
102
+
103
+    def get_order(self, aBuf):
104
+        # We do not handle characters based on the original encoding string,
105
+        # but convert this encoding string to a number, here called order.
106
+        # This allows multiple encodings of a language to share one frequency
107
+        # table.
108
+        return -1
109
+
110
+
111
+class EUCTWDistributionAnalysis(CharDistributionAnalysis):
112
+    def __init__(self):
113
+        CharDistributionAnalysis.__init__(self)
114
+        self._mCharToFreqOrder = EUCTWCharToFreqOrder
115
+        self._mTableSize = EUCTW_TABLE_SIZE
116
+        self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO
117
+
118
+    def get_order(self, aBuf):
119
+        # for euc-TW encoding, we are interested
120
+        #   first  byte range: 0xc4 -- 0xfe
121
+        #   second byte range: 0xa1 -- 0xfe
122
+        # no validation needed here. State machine has done that
123
+        first_char = wrap_ord(aBuf[0])
124
+        if first_char >= 0xC4:
125
+            return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1
126
+        else:
127
+            return -1
128
+
129
+
130
+class EUCKRDistributionAnalysis(CharDistributionAnalysis):
131
+    def __init__(self):
132
+        CharDistributionAnalysis.__init__(self)
133
+        self._mCharToFreqOrder = EUCKRCharToFreqOrder
134
+        self._mTableSize = EUCKR_TABLE_SIZE
135
+        self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO
136
+
137
+    def get_order(self, aBuf):
138
+        # for euc-KR encoding, we are interested
139
+        #   first  byte range: 0xb0 -- 0xfe
140
+        #   second byte range: 0xa1 -- 0xfe
141
+        # no validation needed here. State machine has done that
142
+        first_char = wrap_ord(aBuf[0])
143
+        if first_char >= 0xB0:
144
+            return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1
145
+        else:
146
+            return -1
147
+
148
+
149
+class GB2312DistributionAnalysis(CharDistributionAnalysis):
150
+    def __init__(self):
151
+        CharDistributionAnalysis.__init__(self)
152
+        self._mCharToFreqOrder = GB2312CharToFreqOrder
153
+        self._mTableSize = GB2312_TABLE_SIZE
154
+        self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO
155
+
156
+    def get_order(self, aBuf):
157
+        # for GB2312 encoding, we are interested
158
+        #  first  byte range: 0xb0 -- 0xfe
159
+        #  second byte range: 0xa1 -- 0xfe
160
+        # no validation needed here. State machine has done that
161
+        first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1])
162
+        if (first_char >= 0xB0) and (second_char >= 0xA1):
163
+            return 94 * (first_char - 0xB0) + second_char - 0xA1
164
+        else:
165
+            return -1
166
+
167
+
168
+class Big5DistributionAnalysis(CharDistributionAnalysis):
169
+    def __init__(self):
170
+        CharDistributionAnalysis.__init__(self)
171
+        self._mCharToFreqOrder = Big5CharToFreqOrder
172
+        self._mTableSize = BIG5_TABLE_SIZE
173
+        self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO
174
+
175
+    def get_order(self, aBuf):
176
+        # for big5 encoding, we are interested
177
+        #   first  byte range: 0xa4 -- 0xfe
178
+        #   second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
179
+        # no validation needed here. State machine has done that
180
+        first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1])
181
+        if first_char >= 0xA4:
182
+            if second_char >= 0xA1:
183
+                return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63
184
+            else:
185
+                return 157 * (first_char - 0xA4) + second_char - 0x40
186
+        else:
187
+            return -1
188
+
189
+
190
+class SJISDistributionAnalysis(CharDistributionAnalysis):
191
+    def __init__(self):
192
+        CharDistributionAnalysis.__init__(self)
193
+        self._mCharToFreqOrder = JISCharToFreqOrder
194
+        self._mTableSize = JIS_TABLE_SIZE
195
+        self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO
196
+
197
+    def get_order(self, aBuf):
198
+        # for sjis encoding, we are interested
199
+        #   first  byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
200
+        #   second byte range: 0x40 -- 0x7e,  0x81 -- oxfe
201
+        # no validation needed here. State machine has done that
202
+        first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1])
203
+        if (first_char >= 0x81) and (first_char <= 0x9F):
204
+            order = 188 * (first_char - 0x81)
205
+        elif (first_char >= 0xE0) and (first_char <= 0xEF):
206
+            order = 188 * (first_char - 0xE0 + 31)
207
+        else:
208
+            return -1
209
+        order = order + second_char - 0x40
210
+        if second_char > 0x7F:
211
+            order = -1
212
+        return order
213
+
214
+
215
+class EUCJPDistributionAnalysis(CharDistributionAnalysis):
216
+    def __init__(self):
217
+        CharDistributionAnalysis.__init__(self)
218
+        self._mCharToFreqOrder = JISCharToFreqOrder
219
+        self._mTableSize = JIS_TABLE_SIZE
220
+        self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO
221
+
222
+    def get_order(self, aBuf):
223
+        # for euc-JP encoding, we are interested
224
+        #   first  byte range: 0xa0 -- 0xfe
225
+        #   second byte range: 0xa1 -- 0xfe
226
+        # no validation needed here. State machine has done that
227
+        char = wrap_ord(aBuf[0])
228
+        if char >= 0xA0:
229
+            return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1
230
+        else:
231
+            return -1

+ 106
- 0
Contents/Libraries/Shared/requests/packages/chardet/charsetgroupprober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+# 
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+# 
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+# 
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+# 
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from . import constants
29
+import sys
30
+from .charsetprober import CharSetProber
31
+
32
+
33
+class CharSetGroupProber(CharSetProber):
34
+    def __init__(self):
35
+        CharSetProber.__init__(self)
36
+        self._mActiveNum = 0
37
+        self._mProbers = []
38
+        self._mBestGuessProber = None
39
+
40
+    def reset(self):
41
+        CharSetProber.reset(self)
42
+        self._mActiveNum = 0
43
+        for prober in self._mProbers:
44
+            if prober:
45
+                prober.reset()
46
+                prober.active = True
47
+                self._mActiveNum += 1
48
+        self._mBestGuessProber = None
49
+
50
+    def get_charset_name(self):
51
+        if not self._mBestGuessProber:
52
+            self.get_confidence()
53
+            if not self._mBestGuessProber:
54
+                return None
55
+#                self._mBestGuessProber = self._mProbers[0]
56
+        return self._mBestGuessProber.get_charset_name()
57
+
58
+    def feed(self, aBuf):
59
+        for prober in self._mProbers:
60
+            if not prober:
61
+                continue
62
+            if not prober.active:
63
+                continue
64
+            st = prober.feed(aBuf)
65
+            if not st:
66
+                continue
67
+            if st == constants.eFoundIt:
68
+                self._mBestGuessProber = prober
69
+                return self.get_state()
70
+            elif st == constants.eNotMe:
71
+                prober.active = False
72
+                self._mActiveNum -= 1
73
+                if self._mActiveNum <= 0:
74
+                    self._mState = constants.eNotMe
75
+                    return self.get_state()
76
+        return self.get_state()
77
+
78
+    def get_confidence(self):
79
+        st = self.get_state()
80
+        if st == constants.eFoundIt:
81
+            return 0.99
82
+        elif st == constants.eNotMe:
83
+            return 0.01
84
+        bestConf = 0.0
85
+        self._mBestGuessProber = None
86
+        for prober in self._mProbers:
87
+            if not prober:
88
+                continue
89
+            if not prober.active:
90
+                if constants._debug:
91
+                    sys.stderr.write(prober.get_charset_name()
92
+                                     + ' not active\n')
93
+                continue
94
+            cf = prober.get_confidence()
95
+            if constants._debug:
96
+                sys.stderr.write('%s confidence = %s\n' %
97
+                                 (prober.get_charset_name(), cf))
98
+            if bestConf < cf:
99
+                bestConf = cf
100
+                self._mBestGuessProber = prober
101
+        if not self._mBestGuessProber:
102
+            return 0.0
103
+        return bestConf
104
+#        else:
105
+#            self._mBestGuessProber = self._mProbers[0]
106
+#            return self._mBestGuessProber.get_confidence()

+ 62
- 0
Contents/Libraries/Shared/requests/packages/chardet/charsetprober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Universal charset detector code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 2001
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#   Shy Shalom - original C code
12
+#
13
+# This library is free software; you can redistribute it and/or
14
+# modify it under the terms of the GNU Lesser General Public
15
+# License as published by the Free Software Foundation; either
16
+# version 2.1 of the License, or (at your option) any later version.
17
+#
18
+# This library is distributed in the hope that it will be useful,
19
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21
+# Lesser General Public License for more details.
22
+#
23
+# You should have received a copy of the GNU Lesser General Public
24
+# License along with this library; if not, write to the Free Software
25
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26
+# 02110-1301  USA
27
+######################### END LICENSE BLOCK #########################
28
+
29
+from . import constants
30
+import re
31
+
32
+
33
+class CharSetProber:
34
+    def __init__(self):
35
+        pass
36
+
37
+    def reset(self):
38
+        self._mState = constants.eDetecting
39
+
40
+    def get_charset_name(self):
41
+        return None
42
+
43
+    def feed(self, aBuf):
44
+        pass
45
+
46
+    def get_state(self):
47
+        return self._mState
48
+
49
+    def get_confidence(self):
50
+        return 0.0
51
+
52
+    def filter_high_bit_only(self, aBuf):
53
+        aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf)
54
+        return aBuf
55
+
56
+    def filter_without_english_letters(self, aBuf):
57
+        aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf)
58
+        return aBuf
59
+
60
+    def filter_with_english_letters(self, aBuf):
61
+        # TODO
62
+        return aBuf

+ 61
- 0
Contents/Libraries/Shared/requests/packages/chardet/codingstatemachine.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is mozilla.org code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from .constants import eStart
29
+from .compat import wrap_ord
30
+
31
+
32
+class CodingStateMachine:
33
+    def __init__(self, sm):
34
+        self._mModel = sm
35
+        self._mCurrentBytePos = 0
36
+        self._mCurrentCharLen = 0
37
+        self.reset()
38
+
39
+    def reset(self):
40
+        self._mCurrentState = eStart
41
+
42
+    def next_state(self, c):
43
+        # for each byte we get its class
44
+        # if it is first byte, we also get byte length
45
+        # PY3K: aBuf is a byte stream, so c is an int, not a byte
46
+        byteCls = self._mModel['classTable'][wrap_ord(c)]
47
+        if self._mCurrentState == eStart:
48
+            self._mCurrentBytePos = 0
49
+            self._mCurrentCharLen = self._mModel['charLenTable'][byteCls]
50
+        # from byte's class and stateTable, we get its next state
51
+        curr_state = (self._mCurrentState * self._mModel['classFactor']
52
+                      + byteCls)
53
+        self._mCurrentState = self._mModel['stateTable'][curr_state]
54
+        self._mCurrentBytePos += 1
55
+        return self._mCurrentState
56
+
57
+    def get_current_charlen(self):
58
+        return self._mCurrentCharLen
59
+
60
+    def get_coding_state_machine(self):
61
+        return self._mModel['name']

+ 34
- 0
Contents/Libraries/Shared/requests/packages/chardet/compat.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# Contributor(s):
3
+#   Ian Cordasco - port to Python
4
+#
5
+# This library is free software; you can redistribute it and/or
6
+# modify it under the terms of the GNU Lesser General Public
7
+# License as published by the Free Software Foundation; either
8
+# version 2.1 of the License, or (at your option) any later version.
9
+#
10
+# This library is distributed in the hope that it will be useful,
11
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
+# Lesser General Public License for more details.
14
+#
15
+# You should have received a copy of the GNU Lesser General Public
16
+# License along with this library; if not, write to the Free Software
17
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18
+# 02110-1301  USA
19
+######################### END LICENSE BLOCK #########################
20
+
21
+import sys
22
+
23
+
24
+if sys.version_info < (3, 0):
25
+    base_str = (str, unicode)
26
+else:
27
+    base_str = (bytes, str)
28
+
29
+
30
+def wrap_ord(a):
31
+    if sys.version_info < (3, 0) and isinstance(a, base_str):
32
+        return ord(a)
33
+    else:
34
+        return a

+ 39
- 0
Contents/Libraries/Shared/requests/packages/chardet/constants.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Universal charset detector code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 2001
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#   Shy Shalom - original C code
12
+#
13
+# This library is free software; you can redistribute it and/or
14
+# modify it under the terms of the GNU Lesser General Public
15
+# License as published by the Free Software Foundation; either
16
+# version 2.1 of the License, or (at your option) any later version.
17
+# 
18
+# This library is distributed in the hope that it will be useful,
19
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21
+# Lesser General Public License for more details.
22
+# 
23
+# You should have received a copy of the GNU Lesser General Public
24
+# License along with this library; if not, write to the Free Software
25
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26
+# 02110-1301  USA
27
+######################### END LICENSE BLOCK #########################
28
+
29
+_debug = 0
30
+
31
+eDetecting = 0
32
+eFoundIt = 1
33
+eNotMe = 2
34
+
35
+eStart = 0
36
+eError = 1
37
+eItsMe = 2
38
+
39
+SHORTCUT_THRESHOLD = 0.95

+ 44
- 0
Contents/Libraries/Shared/requests/packages/chardet/cp949prober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is mozilla.org code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from .mbcharsetprober import MultiByteCharSetProber
29
+from .codingstatemachine import CodingStateMachine
30
+from .chardistribution import EUCKRDistributionAnalysis
31
+from .mbcssm import CP949SMModel
32
+
33
+
34
+class CP949Prober(MultiByteCharSetProber):
35
+    def __init__(self):
36
+        MultiByteCharSetProber.__init__(self)
37
+        self._mCodingSM = CodingStateMachine(CP949SMModel)
38
+        # NOTE: CP949 is a superset of EUC-KR, so the distribution should be
39
+        #       not different.
40
+        self._mDistributionAnalyzer = EUCKRDistributionAnalysis()
41
+        self.reset()
42
+
43
+    def get_charset_name(self):
44
+        return "CP949"

+ 86
- 0
Contents/Libraries/Shared/requests/packages/chardet/escprober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is mozilla.org code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from . import constants
29
+from .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel,
30
+                    ISO2022KRSMModel)
31
+from .charsetprober import CharSetProber
32
+from .codingstatemachine import CodingStateMachine
33
+from .compat import wrap_ord
34
+
35
+
36
+class EscCharSetProber(CharSetProber):
37
+    def __init__(self):
38
+        CharSetProber.__init__(self)
39
+        self._mCodingSM = [
40
+            CodingStateMachine(HZSMModel),
41
+            CodingStateMachine(ISO2022CNSMModel),
42
+            CodingStateMachine(ISO2022JPSMModel),
43
+            CodingStateMachine(ISO2022KRSMModel)
44
+        ]
45
+        self.reset()
46
+
47
+    def reset(self):
48
+        CharSetProber.reset(self)
49
+        for codingSM in self._mCodingSM:
50
+            if not codingSM:
51
+                continue
52
+            codingSM.active = True
53
+            codingSM.reset()
54
+        self._mActiveSM = len(self._mCodingSM)
55
+        self._mDetectedCharset = None
56
+
57
+    def get_charset_name(self):
58
+        return self._mDetectedCharset
59
+
60
+    def get_confidence(self):
61
+        if self._mDetectedCharset:
62
+            return 0.99
63
+        else:
64
+            return 0.00
65
+
66
+    def feed(self, aBuf):
67
+        for c in aBuf:
68
+            # PY3K: aBuf is a byte array, so c is an int, not a byte
69
+            for codingSM in self._mCodingSM:
70
+                if not codingSM:
71
+                    continue
72
+                if not codingSM.active:
73
+                    continue
74
+                codingState = codingSM.next_state(wrap_ord(c))
75
+                if codingState == constants.eError:
76
+                    codingSM.active = False
77
+                    self._mActiveSM -= 1
78
+                    if self._mActiveSM <= 0:
79
+                        self._mState = constants.eNotMe
80
+                        return self.get_state()
81
+                elif codingState == constants.eItsMe:
82
+                    self._mState = constants.eFoundIt
83
+                    self._mDetectedCharset = codingSM.get_coding_state_machine()  # nopep8
84
+                    return self.get_state()
85
+
86
+        return self.get_state()

+ 242
- 0
Contents/Libraries/Shared/requests/packages/chardet/escsm.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is mozilla.org code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from .constants import eStart, eError, eItsMe
29
+
30
+HZ_cls = (
31
+1,0,0,0,0,0,0,0,  # 00 - 07
32
+0,0,0,0,0,0,0,0,  # 08 - 0f
33
+0,0,0,0,0,0,0,0,  # 10 - 17
34
+0,0,0,1,0,0,0,0,  # 18 - 1f
35
+0,0,0,0,0,0,0,0,  # 20 - 27
36
+0,0,0,0,0,0,0,0,  # 28 - 2f
37
+0,0,0,0,0,0,0,0,  # 30 - 37
38
+0,0,0,0,0,0,0,0,  # 38 - 3f
39
+0,0,0,0,0,0,0,0,  # 40 - 47
40
+0,0,0,0,0,0,0,0,  # 48 - 4f
41
+0,0,0,0,0,0,0,0,  # 50 - 57
42
+0,0,0,0,0,0,0,0,  # 58 - 5f
43
+0,0,0,0,0,0,0,0,  # 60 - 67
44
+0,0,0,0,0,0,0,0,  # 68 - 6f
45
+0,0,0,0,0,0,0,0,  # 70 - 77
46
+0,0,0,4,0,5,2,0,  # 78 - 7f
47
+1,1,1,1,1,1,1,1,  # 80 - 87
48
+1,1,1,1,1,1,1,1,  # 88 - 8f
49
+1,1,1,1,1,1,1,1,  # 90 - 97
50
+1,1,1,1,1,1,1,1,  # 98 - 9f
51
+1,1,1,1,1,1,1,1,  # a0 - a7
52
+1,1,1,1,1,1,1,1,  # a8 - af
53
+1,1,1,1,1,1,1,1,  # b0 - b7
54
+1,1,1,1,1,1,1,1,  # b8 - bf
55
+1,1,1,1,1,1,1,1,  # c0 - c7
56
+1,1,1,1,1,1,1,1,  # c8 - cf
57
+1,1,1,1,1,1,1,1,  # d0 - d7
58
+1,1,1,1,1,1,1,1,  # d8 - df
59
+1,1,1,1,1,1,1,1,  # e0 - e7
60
+1,1,1,1,1,1,1,1,  # e8 - ef
61
+1,1,1,1,1,1,1,1,  # f0 - f7
62
+1,1,1,1,1,1,1,1,  # f8 - ff
63
+)
64
+
65
+HZ_st = (
66
+eStart,eError,     3,eStart,eStart,eStart,eError,eError,# 00-07
67
+eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f
68
+eItsMe,eItsMe,eError,eError,eStart,eStart,     4,eError,# 10-17
69
+     5,eError,     6,eError,     5,     5,     4,eError,# 18-1f
70
+     4,eError,     4,     4,     4,eError,     4,eError,# 20-27
71
+     4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f
72
+)
73
+
74
+HZCharLenTable = (0, 0, 0, 0, 0, 0)
75
+
76
+HZSMModel = {'classTable': HZ_cls,
77
+             'classFactor': 6,
78
+             'stateTable': HZ_st,
79
+             'charLenTable': HZCharLenTable,
80
+             'name': "HZ-GB-2312"}
81
+
82
+ISO2022CN_cls = (
83
+2,0,0,0,0,0,0,0,  # 00 - 07
84
+0,0,0,0,0,0,0,0,  # 08 - 0f
85
+0,0,0,0,0,0,0,0,  # 10 - 17
86
+0,0,0,1,0,0,0,0,  # 18 - 1f
87
+0,0,0,0,0,0,0,0,  # 20 - 27
88
+0,3,0,0,0,0,0,0,  # 28 - 2f
89
+0,0,0,0,0,0,0,0,  # 30 - 37
90
+0,0,0,0,0,0,0,0,  # 38 - 3f
91
+0,0,0,4,0,0,0,0,  # 40 - 47
92
+0,0,0,0,0,0,0,0,  # 48 - 4f
93
+0,0,0,0,0,0,0,0,  # 50 - 57
94
+0,0,0,0,0,0,0,0,  # 58 - 5f
95
+0,0,0,0,0,0,0,0,  # 60 - 67
96
+0,0,0,0,0,0,0,0,  # 68 - 6f
97
+0,0,0,0,0,0,0,0,  # 70 - 77
98
+0,0,0,0,0,0,0,0,  # 78 - 7f
99
+2,2,2,2,2,2,2,2,  # 80 - 87
100
+2,2,2,2,2,2,2,2,  # 88 - 8f
101
+2,2,2,2,2,2,2,2,  # 90 - 97
102
+2,2,2,2,2,2,2,2,  # 98 - 9f
103
+2,2,2,2,2,2,2,2,  # a0 - a7
104
+2,2,2,2,2,2,2,2,  # a8 - af
105
+2,2,2,2,2,2,2,2,  # b0 - b7
106
+2,2,2,2,2,2,2,2,  # b8 - bf
107
+2,2,2,2,2,2,2,2,  # c0 - c7
108
+2,2,2,2,2,2,2,2,  # c8 - cf
109
+2,2,2,2,2,2,2,2,  # d0 - d7
110
+2,2,2,2,2,2,2,2,  # d8 - df
111
+2,2,2,2,2,2,2,2,  # e0 - e7
112
+2,2,2,2,2,2,2,2,  # e8 - ef
113
+2,2,2,2,2,2,2,2,  # f0 - f7
114
+2,2,2,2,2,2,2,2,  # f8 - ff
115
+)
116
+
117
+ISO2022CN_st = (
118
+eStart,     3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07
119
+eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f
120
+eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17
121
+eItsMe,eItsMe,eItsMe,eError,eError,eError,     4,eError,# 18-1f
122
+eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27
123
+     5,     6,eError,eError,eError,eError,eError,eError,# 28-2f
124
+eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37
125
+eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f
126
+)
127
+
128
+ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0)
129
+
130
+ISO2022CNSMModel = {'classTable': ISO2022CN_cls,
131
+                    'classFactor': 9,
132
+                    'stateTable': ISO2022CN_st,
133
+                    'charLenTable': ISO2022CNCharLenTable,
134
+                    'name': "ISO-2022-CN"}
135
+
136
+ISO2022JP_cls = (
137
+2,0,0,0,0,0,0,0,  # 00 - 07
138
+0,0,0,0,0,0,2,2,  # 08 - 0f
139
+0,0,0,0,0,0,0,0,  # 10 - 17
140
+0,0,0,1,0,0,0,0,  # 18 - 1f
141
+0,0,0,0,7,0,0,0,  # 20 - 27
142
+3,0,0,0,0,0,0,0,  # 28 - 2f
143
+0,0,0,0,0,0,0,0,  # 30 - 37
144
+0,0,0,0,0,0,0,0,  # 38 - 3f
145
+6,0,4,0,8,0,0,0,  # 40 - 47
146
+0,9,5,0,0,0,0,0,  # 48 - 4f
147
+0,0,0,0,0,0,0,0,  # 50 - 57
148
+0,0,0,0,0,0,0,0,  # 58 - 5f
149
+0,0,0,0,0,0,0,0,  # 60 - 67
150
+0,0,0,0,0,0,0,0,  # 68 - 6f
151
+0,0,0,0,0,0,0,0,  # 70 - 77
152
+0,0,0,0,0,0,0,0,  # 78 - 7f
153
+2,2,2,2,2,2,2,2,  # 80 - 87
154
+2,2,2,2,2,2,2,2,  # 88 - 8f
155
+2,2,2,2,2,2,2,2,  # 90 - 97
156
+2,2,2,2,2,2,2,2,  # 98 - 9f
157
+2,2,2,2,2,2,2,2,  # a0 - a7
158
+2,2,2,2,2,2,2,2,  # a8 - af
159
+2,2,2,2,2,2,2,2,  # b0 - b7
160
+2,2,2,2,2,2,2,2,  # b8 - bf
161
+2,2,2,2,2,2,2,2,  # c0 - c7
162
+2,2,2,2,2,2,2,2,  # c8 - cf
163
+2,2,2,2,2,2,2,2,  # d0 - d7
164
+2,2,2,2,2,2,2,2,  # d8 - df
165
+2,2,2,2,2,2,2,2,  # e0 - e7
166
+2,2,2,2,2,2,2,2,  # e8 - ef
167
+2,2,2,2,2,2,2,2,  # f0 - f7
168
+2,2,2,2,2,2,2,2,  # f8 - ff
169
+)
170
+
171
+ISO2022JP_st = (
172
+eStart,     3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07
173
+eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f
174
+eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17
175
+eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f
176
+eError,     5,eError,eError,eError,     4,eError,eError,# 20-27
177
+eError,eError,eError,     6,eItsMe,eError,eItsMe,eError,# 28-2f
178
+eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37
179
+eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f
180
+eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47
181
+)
182
+
183
+ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
184
+
185
+ISO2022JPSMModel = {'classTable': ISO2022JP_cls,
186
+                    'classFactor': 10,
187
+                    'stateTable': ISO2022JP_st,
188
+                    'charLenTable': ISO2022JPCharLenTable,
189
+                    'name': "ISO-2022-JP"}
190
+
191
+ISO2022KR_cls = (
192
+2,0,0,0,0,0,0,0,  # 00 - 07
193
+0,0,0,0,0,0,0,0,  # 08 - 0f
194
+0,0,0,0,0,0,0,0,  # 10 - 17
195
+0,0,0,1,0,0,0,0,  # 18 - 1f
196
+0,0,0,0,3,0,0,0,  # 20 - 27
197
+0,4,0,0,0,0,0,0,  # 28 - 2f
198
+0,0,0,0,0,0,0,0,  # 30 - 37
199
+0,0,0,0,0,0,0,0,  # 38 - 3f
200
+0,0,0,5,0,0,0,0,  # 40 - 47
201
+0,0,0,0,0,0,0,0,  # 48 - 4f
202
+0,0,0,0,0,0,0,0,  # 50 - 57
203
+0,0,0,0,0,0,0,0,  # 58 - 5f
204
+0,0,0,0,0,0,0,0,  # 60 - 67
205
+0,0,0,0,0,0,0,0,  # 68 - 6f
206
+0,0,0,0,0,0,0,0,  # 70 - 77
207
+0,0,0,0,0,0,0,0,  # 78 - 7f
208
+2,2,2,2,2,2,2,2,  # 80 - 87
209
+2,2,2,2,2,2,2,2,  # 88 - 8f
210
+2,2,2,2,2,2,2,2,  # 90 - 97
211
+2,2,2,2,2,2,2,2,  # 98 - 9f
212
+2,2,2,2,2,2,2,2,  # a0 - a7
213
+2,2,2,2,2,2,2,2,  # a8 - af
214
+2,2,2,2,2,2,2,2,  # b0 - b7
215
+2,2,2,2,2,2,2,2,  # b8 - bf
216
+2,2,2,2,2,2,2,2,  # c0 - c7
217
+2,2,2,2,2,2,2,2,  # c8 - cf
218
+2,2,2,2,2,2,2,2,  # d0 - d7
219
+2,2,2,2,2,2,2,2,  # d8 - df
220
+2,2,2,2,2,2,2,2,  # e0 - e7
221
+2,2,2,2,2,2,2,2,  # e8 - ef
222
+2,2,2,2,2,2,2,2,  # f0 - f7
223
+2,2,2,2,2,2,2,2,  # f8 - ff
224
+)
225
+
226
+ISO2022KR_st = (
227
+eStart,     3,eError,eStart,eStart,eStart,eError,eError,# 00-07
228
+eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f
229
+eItsMe,eItsMe,eError,eError,eError,     4,eError,eError,# 10-17
230
+eError,eError,eError,eError,     5,eError,eError,eError,# 18-1f
231
+eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27
232
+)
233
+
234
+ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0)
235
+
236
+ISO2022KRSMModel = {'classTable': ISO2022KR_cls,
237
+                    'classFactor': 6,
238
+                    'stateTable': ISO2022KR_st,
239
+                    'charLenTable': ISO2022KRCharLenTable,
240
+                    'name': "ISO-2022-KR"}
241
+
242
+# flake8: noqa

+ 90
- 0
Contents/Libraries/Shared/requests/packages/chardet/eucjpprober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is mozilla.org code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+import sys
29
+from . import constants
30
+from .mbcharsetprober import MultiByteCharSetProber
31
+from .codingstatemachine import CodingStateMachine
32
+from .chardistribution import EUCJPDistributionAnalysis
33
+from .jpcntx import EUCJPContextAnalysis
34
+from .mbcssm import EUCJPSMModel
35
+
36
+
37
+class EUCJPProber(MultiByteCharSetProber):
38
+    def __init__(self):
39
+        MultiByteCharSetProber.__init__(self)
40
+        self._mCodingSM = CodingStateMachine(EUCJPSMModel)
41
+        self._mDistributionAnalyzer = EUCJPDistributionAnalysis()
42
+        self._mContextAnalyzer = EUCJPContextAnalysis()
43
+        self.reset()
44
+
45
+    def reset(self):
46
+        MultiByteCharSetProber.reset(self)
47
+        self._mContextAnalyzer.reset()
48
+
49
+    def get_charset_name(self):
50
+        return "EUC-JP"
51
+
52
+    def feed(self, aBuf):
53
+        aLen = len(aBuf)
54
+        for i in range(0, aLen):
55
+            # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte
56
+            codingState = self._mCodingSM.next_state(aBuf[i])
57
+            if codingState == constants.eError:
58
+                if constants._debug:
59
+                    sys.stderr.write(self.get_charset_name()
60
+                                     + ' prober hit error at byte ' + str(i)
61
+                                     + '\n')
62
+                self._mState = constants.eNotMe
63
+                break
64
+            elif codingState == constants.eItsMe:
65
+                self._mState = constants.eFoundIt
66
+                break
67
+            elif codingState == constants.eStart:
68
+                charLen = self._mCodingSM.get_current_charlen()
69
+                if i == 0:
70
+                    self._mLastChar[1] = aBuf[0]
71
+                    self._mContextAnalyzer.feed(self._mLastChar, charLen)
72
+                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
73
+                else:
74
+                    self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen)
75
+                    self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],
76
+                                                     charLen)
77
+
78
+        self._mLastChar[0] = aBuf[aLen - 1]
79
+
80
+        if self.get_state() == constants.eDetecting:
81
+            if (self._mContextAnalyzer.got_enough_data() and
82
+               (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):
83
+                self._mState = constants.eFoundIt
84
+
85
+        return self.get_state()
86
+
87
+    def get_confidence(self):
88
+        contxtCf = self._mContextAnalyzer.get_confidence()
89
+        distribCf = self._mDistributionAnalyzer.get_confidence()
90
+        return max(contxtCf, distribCf)

+ 596
- 0
Contents/Libraries/Shared/requests/packages/chardet/euckrfreq.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+# 
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+# 
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+# Sampling from about 20M text materials include literature and computer technology
29
+
30
+# 128  --> 0.79
31
+# 256  --> 0.92
32
+# 512  --> 0.986
33
+# 1024 --> 0.99944
34
+# 2048 --> 0.99999
35
+#
36
+# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24
37
+# Random Distribution Ration = 512 / (2350-512) = 0.279.
38
+# 
39
+# Typical Distribution Ratio  
40
+
41
+EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0
42
+
43
+EUCKR_TABLE_SIZE = 2352
44
+
45
+# Char to FreqOrder table , 
46
+EUCKRCharToFreqOrder = ( \
47
+  13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722,  87,
48
+1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,
49
+1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488,  20,1733,1269,1734,
50
+ 945,1400,1735,  47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,
51
+ 116, 987, 813,1401, 683,  75,1204, 145,1740,1741,1742,1743,  16, 847, 667, 622,
52
+ 708,1744,1745,1746, 966, 787, 304, 129,1747,  60, 820, 123, 676,1748,1749,1750,
53
+1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,
54
+ 344,1763,1764,1765,1766,  89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,
55
+ 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,
56
+1780, 337, 751,1058,  28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782,  19,
57
+1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,
58
+1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,
59
+1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,
60
+1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,
61
+ 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,
62
+1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,
63
+1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,
64
+1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,
65
+1412,1837,1838,  39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,
66
+ 544,1023,1081, 869,  91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,
67
+1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,
68
+ 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,
69
+ 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,
70
+1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,
71
+ 282,  96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,
72
+1421, 268,1877,1422,1878,1879,1880, 308,1881,   2, 537,1882,1883,1215,1884,1885,
73
+ 127, 791,1886,1273,1423,1887,  34, 336, 404, 643,1888, 571, 654, 894, 840,1889,
74
+   0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,
75
+1894,1123,  48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,
76
+1899, 694,1900, 909, 734,1424, 572, 866,1425, 691,  85, 524,1010, 543, 394, 841,
77
+1901,1902,1903,1026,1904,1905,1906,1907,1908,1909,  30, 451, 651, 988, 310,1910,
78
+1911,1426, 810,1216,  93,1912,1913,1277,1217,1914, 858, 759,  45,  58, 181, 610,
79
+ 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,
80
+1919, 359,1920, 687,1921, 822,1922, 293,1923,1924,  40, 662, 118, 692,  29, 939,
81
+ 887, 640, 482, 174,1925,  69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,
82
+ 217, 854,1163, 823,1927,1928,1929,1930, 834,1931,  78,1932, 859,1933,1063,1934,
83
+1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,
84
+1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,
85
+1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,
86
+1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,
87
+1283,1222,1960,1961,1962,1963,  36, 383, 228, 753, 247, 454,1964, 876, 678,1965,
88
+1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,
89
+  50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,
90
+ 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971,   7,
91
+ 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,
92
+1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,
93
+ 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,
94
+1995, 560, 223,1287,  98,   8, 189, 650, 978,1288,1996,1437,1997,  17, 345, 250,
95
+ 423, 277, 234, 512, 226,  97, 289,  42, 167,1998, 201,1999,2000, 843, 836, 824,
96
+ 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,
97
+2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008,  71,1440, 745,
98
+ 619, 688,2009, 829,2010,2011, 147,2012,  33, 948,2013,2014,  74, 224,2015,  61,
99
+ 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,
100
+2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591,  52, 724, 246,2031,2032,
101
+2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,
102
+2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,
103
+ 719,1170, 959, 440, 437, 534,  84, 388, 480,1131, 159, 220, 198, 679,2044,1012,
104
+ 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,
105
+2051,2052,2053,  59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,
106
+ 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,
107
+1444,2064,2065,  41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,
108
+2069,1292,2070,2071,1445,2072,1446,2073,2074,  55, 588,  66,1447, 271,1092,2075,
109
+1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,
110
+2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,
111
+2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,
112
+1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,
113
+ 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,
114
+2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,
115
+2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,
116
+  22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174,  73,1096, 231, 274,
117
+ 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,
118
+2141,2142,2143,2144,  11, 374, 844,2145, 154,1232,  46,1461,2146, 838, 830, 721,
119
+1233, 106,2147,  90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,
120
+2150,1462, 761, 565,2151, 686,2152, 649,2153,  72, 173,2154, 460, 415,2155,1463,
121
+2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,
122
+2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177,  23, 530, 285,
123
+2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,
124
+2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193,  10,
125
+2194, 613, 424,2195, 979, 108, 449, 589,  27, 172,  81,1031,  80, 774, 281, 350,
126
+1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,
127
+2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,
128
+2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,
129
+2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,
130
+2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,
131
+2243, 521, 486, 548,2244,2245,2246,1473,1300,  53, 549, 137, 875,  76, 158,2247,
132
+1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,
133
+1475,2249,  82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,
134
+2256,  18, 450, 206,2257, 290, 292,1142,2258, 511, 162,  99, 346, 164, 735,2259,
135
+1476,1477,   4, 554, 343, 798,1099,2260,1100,2261,  43, 171,1303, 139, 215,2262,
136
+2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,
137
+1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272,  67,2273,
138
+ 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,
139
+2282,2283,2284,2285,2286,  70, 852,1071,2287,2288,2289,2290,  21,  56, 509, 117,
140
+ 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,
141
+2294,1046,1479,2295, 340,2296,  63,1047, 230,2297,2298,1305, 763,1306, 101, 800,
142
+ 808, 494,2299,2300,2301, 903,2302,  37,1072,  14,   5,2303,  79, 675,2304, 312,
143
+2305,2306,2307,2308,2309,1480,   6,1307,2310,2311,2312,   1, 470,  35,  24, 229,
144
+2313, 695, 210,  86, 778,  15, 784, 592, 779,  32,  77, 855, 964,2314, 259,2315,
145
+ 501, 380,2316,2317,  83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,
146
+2320,2321,2322,2323,2324,2325,1485,2326,2327, 128,  57,  68, 261,1048, 211, 170,
147
+1240,  31,2328,  51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,
148
+ 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,
149
+1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,
150
+2351,1490,1491,  62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,
151
+1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,
152
+2361,2362, 332,  12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,
153
+ 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,
154
+2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,
155
+1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,
156
+2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,
157
+1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,
158
+2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,
159
+1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,
160
+ 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,
161
+2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,
162
+2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,
163
+ 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,
164
+ 915, 489,2449,1514,1184,2450,2451, 515,  64, 427, 495,2452, 583,2453, 483, 485,
165
+1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,
166
+1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,
167
+ 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,
168
+2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,
169
+2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,
170
+ 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187,  65,2494,
171
+ 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,
172
+ 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,
173
+2499,2500,  49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,
174
+  95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,
175
+ 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,
176
+2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,
177
+2533,  25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,
178
+ 704, 504, 468, 758, 657,1528, 196,  44, 839,1246, 272, 750,2543, 765, 862,2544,
179
+2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,
180
+1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,
181
+ 249,1075,2556,2557,2558, 466, 743,2559,2560,2561,  92, 514, 426, 420, 526,2562,
182
+2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,
183
+2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,
184
+2584,1532,  54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,
185
+   3, 458,   9,  38,2588, 107, 110, 890, 209,  26, 737, 498,2589,1534,2590, 431,
186
+ 202,  88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,
187
+ 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,
188
+2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601,  94, 175, 197, 406,
189
+2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,
190
+2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,
191
+1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,
192
+2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,
193
+ 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642,  # 512, 256
194
+#Everything below is of no interest for detection purpose
195
+2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,
196
+2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,
197
+2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,
198
+2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704,
199
+2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,
200
+2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734,
201
+2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,
202
+2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,
203
+2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,
204
+2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793,
205
+2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,
206
+2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,
207
+2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,
208
+2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,
209
+1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869,
210
+2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883,
211
+2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,
212
+2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,
213
+2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331,
214
+2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945,
215
+2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,
216
+2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,
217
+2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,
218
+2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,
219
+3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021,
220
+3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,
221
+3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052,
222
+3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,
223
+3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080,
224
+3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,
225
+3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110,
226
+3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124,
227
+3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,
228
+3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,
229
+3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,
230
+3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,
231
+3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,
232
+3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,
233
+3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,
234
+3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,
235
+3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,
236
+3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279,
237
+3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,
238
+3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,
239
+3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,
240
+3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,
241
+3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,
242
+3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,
243
+3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389,
244
+3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,
245
+3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338,
246
+3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432,
247
+3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446,
248
+3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191,
249
+3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471,
250
+3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,
251
+1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499,
252
+1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513,
253
+3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525,
254
+3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,
255
+3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,
256
+3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,
257
+3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587,
258
+3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,
259
+3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,
260
+3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632,
261
+3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,
262
+3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663,
263
+3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,
264
+3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,
265
+3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583,
266
+1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722,
267
+3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,
268
+3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753,
269
+3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767,
270
+3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782,
271
+3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796,
272
+3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810,
273
+3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591,
274
+1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836,
275
+3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851,
276
+3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866,
277
+3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880,
278
+3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895,
279
+1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905,
280
+3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,
281
+3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934,
282
+3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603,
283
+3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,
284
+3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978,
285
+3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993,
286
+3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,
287
+4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024,
288
+4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,
289
+1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,
290
+4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069,
291
+4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083,
292
+4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098,
293
+4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113,
294
+4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610,
295
+4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142,
296
+4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,
297
+4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173,
298
+4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,
299
+4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,
300
+4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220,
301
+4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234,
302
+4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249,
303
+4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,
304
+4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279,
305
+4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294,
306
+4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,
307
+4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,
308
+4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341,
309
+4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,
310
+4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371,
311
+4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,
312
+4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,
313
+4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418,
314
+4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432,
315
+4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446,
316
+4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461,
317
+4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,
318
+4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491,
319
+4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,
320
+4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623,
321
+4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536,
322
+4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551,
323
+4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,
324
+4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581,
325
+4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627,
326
+4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,
327
+4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,
328
+4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,
329
+4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657,
330
+4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,
331
+4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687,
332
+1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700,
333
+4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715,
334
+4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,
335
+4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633,
336
+4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758,
337
+4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773,
338
+4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788,
339
+4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803,
340
+4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817,
341
+4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832,
342
+4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,
343
+4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,
344
+4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,
345
+4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893,
346
+4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,
347
+4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923,
348
+4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938,
349
+4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,
350
+4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,
351
+4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645,
352
+4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,
353
+5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078,
354
+5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028,
355
+1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042,
356
+5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056,
357
+5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,
358
+5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,
359
+5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,
360
+5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118,
361
+1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132,
362
+5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,
363
+5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,
364
+5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,
365
+5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,
366
+5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206,
367
+1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218,
368
+5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,
369
+5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249,
370
+5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262,
371
+5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,
372
+5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,
373
+5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308,
374
+5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323,
375
+5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338,
376
+5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,
377
+5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,
378
+5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,
379
+5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400,
380
+5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415,
381
+5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,
382
+5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445,
383
+5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,
384
+5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,
385
+5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491,
386
+5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,
387
+5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,
388
+5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,
389
+5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554,
390
+5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,
391
+1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,
392
+5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600,
393
+5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615,
394
+5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,
395
+5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,
396
+5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,
397
+1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673,
398
+5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,
399
+5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703,
400
+5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716,
401
+5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729,
402
+5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744,
403
+1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758,
404
+5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773,
405
+1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786,
406
+5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801,
407
+5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,
408
+5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,
409
+5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,
410
+5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862,
411
+5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876,
412
+5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889,
413
+5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,
414
+5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,
415
+5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687,
416
+5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,
417
+5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963,
418
+5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,
419
+5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,
420
+5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009,
421
+6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,
422
+6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,
423
+6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,
424
+6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,
425
+6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086,
426
+6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102,
427
+6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118,
428
+6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133,
429
+6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147,
430
+6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,
431
+6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,
432
+6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194,
433
+6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,
434
+6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225,
435
+6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,
436
+6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256,
437
+6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271,  #1024
438
+6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,
439
+6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699,
440
+6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317,
441
+6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,
442
+6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347,
443
+6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,
444
+6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,
445
+6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,
446
+6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,
447
+6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425,
448
+6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440,
449
+6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,
450
+6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,
451
+6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,
452
+6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266,
453
+6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,
454
+6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535,
455
+6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,
456
+1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,
457
+6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581,
458
+6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,
459
+6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613,
460
+6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629,
461
+6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644,
462
+1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659,
463
+6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,
464
+1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689,
465
+6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,
466
+6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,
467
+6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,
468
+1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748,
469
+6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763,
470
+6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779,
471
+6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794,
472
+6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711,
473
+6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825,
474
+6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840,
475
+6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856,
476
+6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872,
477
+6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888,
478
+6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903,
479
+6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918,
480
+6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,
481
+6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,
482
+6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,
483
+6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981,
484
+6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996,
485
+6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,
486
+7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,
487
+7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,
488
+7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,
489
+7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,
490
+7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090,
491
+7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,
492
+7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,
493
+7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,
494
+7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154,
495
+7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170,
496
+7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,
497
+7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,
498
+7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216,
499
+7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232,
500
+7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248,
501
+7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,
502
+7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,
503
+7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296,
504
+7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312,
505
+7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,
506
+7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,
507
+7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359,
508
+7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375,
509
+7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,
510
+7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407,
511
+7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423,
512
+7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,
513
+7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,
514
+7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,
515
+7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,
516
+7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,
517
+7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,
518
+7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,
519
+7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,
520
+7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,
521
+7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,
522
+7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,
523
+7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,
524
+7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,
525
+7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,
526
+7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,
527
+7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,
528
+7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,
529
+7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,
530
+7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,
531
+7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,
532
+7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,
533
+7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,
534
+7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,
535
+7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,
536
+7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,
537
+7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,
538
+7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,
539
+7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,
540
+7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,
541
+7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,
542
+7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,
543
+7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,
544
+7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,
545
+7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967,
546
+7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,
547
+7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,
548
+8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,
549
+8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031,
550
+8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,
551
+8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,
552
+8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,
553
+8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,
554
+8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,
555
+8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127,
556
+8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,
557
+8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,
558
+8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,
559
+8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,
560
+8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,
561
+8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,
562
+8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,
563
+8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,
564
+8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,
565
+8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,
566
+8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,
567
+8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,
568
+8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,
569
+8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,
570
+8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,
571
+8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,
572
+8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,
573
+8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,
574
+8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,
575
+8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,
576
+8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,
577
+8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,
578
+8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,
579
+8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,
580
+8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,
581
+8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,
582
+8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,
583
+8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,
584
+8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,
585
+8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,
586
+8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,
587
+8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,
588
+8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,
589
+8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,
590
+8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,
591
+8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,
592
+8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,
593
+8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,
594
+8736,8737,8738,8739,8740,8741)
595
+
596
+# flake8: noqa

+ 42
- 0
Contents/Libraries/Shared/requests/packages/chardet/euckrprober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is mozilla.org code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from .mbcharsetprober import MultiByteCharSetProber
29
+from .codingstatemachine import CodingStateMachine
30
+from .chardistribution import EUCKRDistributionAnalysis
31
+from .mbcssm import EUCKRSMModel
32
+
33
+
34
+class EUCKRProber(MultiByteCharSetProber):
35
+    def __init__(self):
36
+        MultiByteCharSetProber.__init__(self)
37
+        self._mCodingSM = CodingStateMachine(EUCKRSMModel)
38
+        self._mDistributionAnalyzer = EUCKRDistributionAnalysis()
39
+        self.reset()
40
+
41
+    def get_charset_name(self):
42
+        return "EUC-KR"

+ 428
- 0
Contents/Libraries/Shared/requests/packages/chardet/euctwfreq.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+# EUCTW frequency table
29
+# Converted from big5 work
30
+# by Taiwan's Mandarin Promotion Council
31
+# <http:#www.edu.tw:81/mandr/>
32
+
33
+# 128  --> 0.42261
34
+# 256  --> 0.57851
35
+# 512  --> 0.74851
36
+# 1024 --> 0.89384
37
+# 2048 --> 0.97583
38
+#
39
+# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
40
+# Random Distribution Ration = 512/(5401-512)=0.105
41
+#
42
+# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
43
+
44
+EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75
45
+
46
+# Char to FreqOrder table ,
47
+EUCTW_TABLE_SIZE = 8102
48
+
49
+EUCTWCharToFreqOrder = (
50
+   1,1800,1506, 255,1431, 198,   9,  82,   6,7310, 177, 202,3615,1256,2808, 110, # 2742
51
+3735,  33,3241, 261,  76,  44,2113,  16,2931,2184,1176, 659,3868,  26,3404,2643, # 2758
52
+1198,3869,3313,4060, 410,2211, 302, 590, 361,1963,   8, 204,  58,4296,7311,1931, # 2774
53
+  63,7312,7313, 317,1614,  75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790
54
+3616,   3,  10,3870,1471,  29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806
55
+4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932,  34,3501,3173,  64, 604, # 2822
56
+7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337,  72, 406,7319,  80, # 2838
57
+ 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449,  69,2969, 591, # 2854
58
+ 179,2095, 471, 115,2034,1843,  60,  50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870
59
+ 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886
60
+2495,  90,2707,1338, 663,  11, 906,1099,2545,  20,2436, 182, 532,1716,7321, 732, # 2902
61
+1376,4062,1311,1420,3175,  25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918
62
+3243, 475,1447,3617,7322, 117,  21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934
63
+ 706, 456, 150, 613,4299,  71,1118,2036,4064, 145,3069,  85, 835, 486,2114,1246, # 2950
64
+1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966
65
+3503,3110,7325,1955,1153,4065,  83, 296,1199,3070, 192, 624,  93,7326, 822,1897, # 2982
66
+2810,3111, 795,2064, 991,1554,1542,1592,  27,  43,2853, 859, 139,1456, 860,4300, # 2998
67
+ 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014
68
+3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030
69
+1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046
70
+7328,7329,2173,3176,3619,2673, 593, 845,1062,3244,  88,1723,2037,3875,1950, 212, # 3062
71
+ 266, 152, 149, 468,1898,4066,4302,  77, 187,7330,3018,  37,   5,2972,7331,3876, # 3078
72
+7332,7333,  39,2517,4303,2894,3177,2078,  55, 148,  74,4304, 545, 483,1474,1029, # 3094
73
+1665, 217,1869,1531,3113,1104,2645,4067,  24, 172,3507, 900,3877,3508,3509,4305, # 3110
74
+  32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674,   4,3019,3314,1427,1788, # 3126
75
+ 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142
76
+3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439,  38,7339,1063,7340, 794, # 3158
77
+3879,1435,2296,  46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804,  35, 707, # 3174
78
+ 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190
79
+2128,1363,3623,1423, 697, 100,3071,  48,  70,1231, 495,3114,2193,7345,1294,7346, # 3206
80
+2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222
81
+ 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238
82
+ 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254
83
+3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270
84
+1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286
85
+1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302
86
+1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381,   7, # 3318
87
+2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334
88
+ 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350
89
+4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366
90
+1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382
91
+7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398
92
+2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414
93
+ 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430
94
+  98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446
95
+ 523,2776,2777,2648,7364, 141,2231,1333,  68, 176, 441, 876, 907,4077, 603,2592, # 3462
96
+ 710, 171,3417, 404, 549,  18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478
97
+7366,2973, 368,7367, 146, 366,  99, 871,3627,1543, 748, 807,1586,1185,  22,2258, # 3494
98
+ 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510
99
+1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371,  59,7372, # 3526
100
+ 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542
101
+ 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558
102
+7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574
103
+1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590
104
+ 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606
105
+3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622
106
+4081,  57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638
107
+3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654
108
+ 279,3120,  51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670
109
+ 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686
110
+1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702
111
+4084,2468,1436, 953,4085,2054,4331, 671,2395,  79,4086,2441,3252, 608, 567,2680, # 3718
112
+3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734
113
+3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750
114
+2397,7400,7401,7402,4089,3025,   0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766
115
+7404, 233,4090,3631,1818,4336,4337,7405,  96,1776,1315,2082,7406, 257,7407,1809, # 3782
116
+3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798
117
+7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814
118
+1484,7413,1712, 127,  67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830
119
+2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846
120
+1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862
121
+  78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878
122
+1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894
123
+4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910
124
+3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926
125
+ 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942
126
+ 165, 243,4345,3637,2521, 123, 683,4096, 764,4346,  36,3895,1792, 589,2902, 816, # 3958
127
+ 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974
128
+2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990
129
+7425, 611,1156, 854,2381,1316,2861,   2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006
130
+1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022
131
+2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038
132
+1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054
133
+1993,7438,4350,7439,7440,2195,  13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070
134
+7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086
135
+7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102
136
+7452, 128,2132,  92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118
137
+3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134
138
+4353,2248,  94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150
139
+1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166
140
+7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182
141
+2332,2067,  23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198
142
+7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214
143
+3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230
144
+3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863,  41,7473, # 4246
145
+7474,4361,7475,1657,2333,  19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262
146
+2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278
147
+7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294
148
+ 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310
149
+4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326
150
+2683, 733,  40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342
151
+7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358
152
+3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374
153
+2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390
154
+2752,2986,7490, 435,7491, 343,1108, 596,  17,1751,4365,2235,3430,3643,7492,4366, # 4406
155
+ 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422
156
+2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438
157
+1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454
158
+1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470
159
+2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486
160
+1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502
161
+7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518
162
+7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534
163
+2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550
164
+4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566
165
+1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551,  30,2263,4122, # 4582
166
+7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598
167
+ 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614
168
+4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630
169
+ 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646
170
+2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662
171
+ 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678
172
+1041,2987, 293,1168,  87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694
173
+1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710
174
+ 730,1515, 184,2827,  66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726
175
+3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742
176
+3918,7535,7536,1186,  15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758
177
+1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774
178
+3541,1342,1681,1718, 766,3264, 286,  89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790
179
+7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806
180
+7544,3265, 310, 313,3435,2299, 770,4134,  54,3034, 189,4397,3082,3769,3922,7545, # 4822
181
+1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838
182
+2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854
183
+1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870
184
+3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886
185
+2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902
186
+3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918
187
+2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934
188
+4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950
189
+4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966
190
+3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982
191
+  97,  81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998
192
+3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014
193
+ 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030
194
+3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046
195
+3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062
196
+3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078
197
+1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094
198
+7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110
199
+ 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126
200
+7590, 587,  14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142
201
+1702,1226, 102,1547,  62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158
202
+ 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174
203
+4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598,  86,1494,1730, # 5190
204
+3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206
205
+ 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222
206
+2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238
207
+2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885,  28,2686, # 5254
208
+3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270
209
+1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286
210
+4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302
211
+2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318
212
+1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334
213
+1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350
214
+2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366
215
+3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382
216
+1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398
217
+7617,3446,7618,7619,7620,3277,2689,1433,3278, 131,  95,1504,3946, 723,4159,3141, # 5414
218
+1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430
219
+4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654,  53,7624,2996,7625, # 5446
220
+1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462
221
+ 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478
222
+1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494
223
+3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510
224
+3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526
225
+2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542
226
+1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558
227
+4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574
228
+ 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590
229
+7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606
230
+2317,3283,7650,7651,4164,7652,4165,  84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622
231
+3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638
232
+4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654
233
+ 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670
234
+7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686
235
+7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702
236
+1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718
237
+4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734
238
+3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750
239
+2690,1516,3559,1121,1082,1329,3284,3970,1449,3794,  65,1128,2835,2913,2759,1590, # 5766
240
+3795,7674,7675,  12,2658,  45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782
241
+3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798
242
+2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814
243
+1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830
244
+4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846
245
+3670,1858,  91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862
246
+3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878
247
+2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894
248
+4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761,  61,3976,3672,1822,3977, # 5910
249
+7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926
250
+3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942
251
+2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958
252
+3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974
253
+1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990
254
+2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006
255
+3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022
256
+4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043,  56,1396,3090, # 6038
257
+2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054
258
+2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070
259
+7722,1076,  49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086
260
+1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102
261
+2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118
262
+1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134
263
+3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150
264
+4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629,  31,2838, # 6166
265
+2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182
266
+3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198
267
+3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214
268
+2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230
269
+4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246
270
+2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262
271
+3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278
272
+4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294
273
+7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310
274
+3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326
275
+ 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342
276
+1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412,  42,3096, 464,7759,2632, # 6358
277
+4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374
278
+1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390
279
+4487,7766,3002, 962, 588,3574, 289,3219,2634,1116,  52,7767,3047,1796,7768,7769, # 6406
280
+7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422
281
+ 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438
282
+7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454
283
+2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470
284
+1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486
285
+1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502
286
+3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518
287
+ 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534
288
+ 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550
289
+ 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566
290
+3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582
291
+2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598
292
+ 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614
293
+7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630
294
+1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646
295
+3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662
296
+7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678
297
+1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694
298
+7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710
299
+4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726
300
+1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742
301
+2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758
302
+2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774
303
+4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790
304
+ 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806
305
+ 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822
306
+3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838
307
+3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854
308
+1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870
309
+2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886
310
+7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902
311
+1561,2664,1452,4010,1375,7855,7856,  47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918
312
+1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934
313
+3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950
314
+ 919,2347,2960,2348,1270,4511,4012,  73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966
315
+1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982
316
+4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998
317
+7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014
318
+2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030
319
+3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046
320
+ 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062
321
+1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078
322
+2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094
323
+2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110
324
+7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126
325
+7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142
326
+7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158
327
+2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174
328
+2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190
329
+1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206
330
+4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222
331
+3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238
332
+3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254
333
+4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270
334
+4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286
335
+2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302
336
+2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318
337
+7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334
338
+4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350
339
+7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366
340
+2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382
341
+1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398
342
+3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414
343
+4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430
344
+2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446
345
+ 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462
346
+2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478
347
+1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494
348
+2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510
349
+2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526
350
+4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542
351
+7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558
352
+1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574
353
+3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590
354
+7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606
355
+1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622
356
+8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638
357
+2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654
358
+8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670
359
+2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686
360
+2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702
361
+8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718
362
+8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734
363
+8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750
364
+ 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766
365
+8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782
366
+4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798
367
+3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814
368
+8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830
369
+1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846
370
+8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862
371
+ 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878
372
+1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894
373
+ 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910
374
+4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926
375
+1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942
376
+4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958
377
+1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974
378
+ 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990
379
+3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006
380
+4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022
381
+8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038
382
+ 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054
383
+3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070
384
+ 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086
385
+2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102
386
+#Everything below is of no interest for detection purpose
387
+2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118
388
+2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134
389
+8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150
390
+8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166
391
+8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182
392
+8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198
393
+8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214
394
+8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230
395
+8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246
396
+8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262
397
+8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278
398
+8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294
399
+8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310
400
+8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326
401
+8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342
402
+8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358
403
+8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374
404
+8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390
405
+8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406
406
+8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422
407
+8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438
408
+8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454
409
+8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470
410
+8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486
411
+8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502
412
+8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518
413
+8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534
414
+8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550
415
+8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566
416
+8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582
417
+8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598
418
+8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614
419
+8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630
420
+8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646
421
+8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662
422
+8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678
423
+8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694
424
+8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710
425
+8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726
426
+8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742
427
+
428
+# flake8: noqa

+ 41
- 0
Contents/Libraries/Shared/requests/packages/chardet/euctwprober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is mozilla.org code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+# 
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+# 
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from .mbcharsetprober import MultiByteCharSetProber
29
+from .codingstatemachine import CodingStateMachine
30
+from .chardistribution import EUCTWDistributionAnalysis
31
+from .mbcssm import EUCTWSMModel
32
+
33
+class EUCTWProber(MultiByteCharSetProber):
34
+    def __init__(self):
35
+        MultiByteCharSetProber.__init__(self)
36
+        self._mCodingSM = CodingStateMachine(EUCTWSMModel)
37
+        self._mDistributionAnalyzer = EUCTWDistributionAnalysis()
38
+        self.reset()
39
+
40
+    def get_charset_name(self):
41
+        return "EUC-TW"

+ 472
- 0
Contents/Libraries/Shared/requests/packages/chardet/gb2312freq.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+# GB2312 most frequently used character table
29
+#
30
+# Char to FreqOrder table , from hz6763
31
+
32
+# 512  --> 0.79  -- 0.79
33
+# 1024 --> 0.92  -- 0.13
34
+# 2048 --> 0.98  -- 0.06
35
+# 6768 --> 1.00  -- 0.02
36
+#
37
+# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79
38
+# Random Distribution Ration = 512 / (3755 - 512) = 0.157
39
+#
40
+# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR
41
+
42
+GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9
43
+
44
+GB2312_TABLE_SIZE = 3760
45
+
46
+GB2312CharToFreqOrder = (
47
+1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
48
+2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,
49
+2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,
50
+ 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,
51
+1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,
52
+1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,
53
+ 152,1687,1539, 738,1559,  59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,
54
+1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850,  70,3285,2729,3534,3575,
55
+2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,
56
+3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,
57
+ 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,
58
+1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,
59
+ 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,
60
+2534,1546,2393,2760, 737,2494,  13, 447, 245,2747,  38,2765,2129,2589,1079, 606,
61
+ 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,
62
+2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,
63
+1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,
64
+3195,4115,5627,2489,2991,  24,2065,2697,1087,2719,  48,1634, 315,  68, 985,2052,
65
+ 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,
66
+1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,
67
+ 253,3099,  32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,
68
+2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,
69
+1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563,  26,
70
+3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,
71
+1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,
72
+2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,
73
+1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,
74
+ 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,
75
+3777,3657, 643,2298,1148,1779, 190, 989,3544, 414,  11,2135,2063,2979,1471, 403,
76
+3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,
77
+ 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,
78
+3651, 210,  33,1608,2516, 200,1520, 415, 102,   0,3389,1287, 817,  91,3299,2940,
79
+ 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687,  20,1819, 121,
80
+1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,
81
+3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,
82
+2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680,  72, 842,1990, 212,1233,
83
+1154,1586,  75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,
84
+ 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,
85
+1910, 534, 529,3309,1721,1660, 274,  39,2827, 661,2670,1578, 925,3248,3815,1094,
86
+4278,4901,4252,  41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,
87
+ 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,
88
+3568, 194,5062,  15, 961,3870,1241,1192,2664,  66,5215,3260,2111,1295,1127,2152,
89
+3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426,  53,2909,
90
+ 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,
91
+1272,2363, 284,1753,3679,4064,1695,  81, 815,2677,2757,2731,1386, 859, 500,4221,
92
+2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,
93
+1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,
94
+1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,
95
+ 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,
96
+3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,
97
+3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640,  67,2360,
98
+4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,
99
+ 296,3979,1739,1611,3684,  23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,
100
+3116,  17,1074, 467,2692,2201, 387,2922,  45,1326,3055,1645,3659,2817, 958, 243,
101
+1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,
102
+1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,
103
+4046,3572,2399,1571,3281,  79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,
104
+ 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,
105
+ 814,4968,3487,1548,2644,1567,1285,   2, 295,2636,  97, 946,3576, 832, 141,4257,
106
+3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,
107
+1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,
108
+ 602,1525,2608,1605,1639,3175, 694,3064,  10, 465,  76,2000,4846,4208, 444,3781,
109
+1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,
110
+2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844,  89, 937,
111
+ 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,
112
+ 432, 445,2811, 206,4136,1472, 730, 349,  73, 397,2802,2547, 998,1637,1167, 789,
113
+ 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,
114
+3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,
115
+4996, 371,1575,2436,1621,2210, 984,4033,1734,2638,  16,4529, 663,2755,3255,1451,
116
+3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,
117
+ 750,2058, 165,  80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,
118
+2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,
119
+2357, 395,3740, 137,2075, 944,4089,2584,1267,3802,  62,1533,2285, 178, 176, 780,
120
+2440, 201,3707, 590, 478,1560,4354,2117,1075,  30,  74,4643,4004,1635,1441,2745,
121
+ 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,
122
+2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,
123
+ 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669,  43,2523,1657,
124
+ 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,
125
+ 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,
126
+3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,
127
+2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,
128
+2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024,  40,3240,1536,
129
+1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,
130
+  18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,
131
+2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,
132
+  90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,
133
+ 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,
134
+1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,
135
+1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076,  46,4253,2873,1889,1894,
136
+ 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,
137
+ 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,
138
+1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,
139
+2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,
140
+3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,
141
+2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,
142
+2269,2246,1446,  36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,
143
+2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,
144
+3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,
145
+1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906,  51, 369, 170,3541,
146
+1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,
147
+2101,2730,2490,  82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,
148
+1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,
149
+3750,2289,2795, 813,3123,2610,1136,4368,   5,3391,4541,2174, 420, 429,1728, 754,
150
+1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,
151
+1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,
152
+3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,
153
+ 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,
154
+2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,
155
+1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,
156
+4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,
157
+1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,
158
+1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,
159
+3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,
160
+1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,
161
+  47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,
162
+ 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096,  99,
163
+1397,1769,2300,4428,1643,3455,1978,1757,3718,1440,  35,4879,3742,1296,4228,2280,
164
+ 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,
165
+1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,
166
+1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,
167
+ 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,
168
+3708, 135,2131,  87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,
169
+4314,   9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,
170
+3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,
171
+2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,
172
+2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,
173
+1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,
174
+3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,
175
+2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,
176
+1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,
177
+1505,1911,1883,3526, 698,3629,3456,1833,1431, 746,  77,1261,2017,2296,1977,1885,
178
+ 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,
179
+2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,
180
+2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,
181
+3192,2910,2010, 140,2395,2859,  55,1082,2012,2901, 662, 419,2081,1438, 680,2774,
182
+4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,
183
+3399,  98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,
184
+ 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,
185
+3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,
186
+2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,
187
+1086,1974,2034, 630, 257,3338,2788,4903,1017,  86,4790, 966,2789,1995,1696,1131,
188
+ 259,3095,4188,1308, 179,1463,5257, 289,4107,1248,  42,3413,1725,2288, 896,1947,
189
+ 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,
190
+3034,3310, 540,2370,1562,1288,2990, 502,4765,1147,   4,1853,2708, 207, 294,2814,
191
+4078,2902,2509, 684,  34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,
192
+2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,
193
+1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,
194
+1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,
195
+ 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,
196
+1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196,  19, 941,3624,3480,
197
+3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,
198
+ 955,1089,3103,1053,  96,  88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,
199
+ 642,4006, 903,2539,1877,2082, 596,  29,4066,1790, 722,2157, 130, 995,1569, 769,
200
+1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445,  50, 625, 487,2207,
201
+  57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,
202
+1783, 362,   8,3433,3422, 610,2793,3277,1390,1284,1654,  21,3823, 734, 367, 623,
203
+ 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,
204
+2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,
205
+ 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,
206
+2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,
207
+2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,
208
+1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,
209
+1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,
210
+2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,
211
+ 819,1541, 142,2284,  44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,
212
+1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,
213
+1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,
214
+2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,
215
+2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434,  92,1466,4920,2616,
216
+3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,
217
+1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,
218
+4462,  64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,
219
+ 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,
220
+ 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,
221
+3264,2855,2722,1952,1029,2839,2467,  84,4383,2215, 820,1391,2015,2448,3672, 377,
222
+1948,2168, 797,2545,3536,2578,2645,  94,2874,1678, 405,1259,3071, 771, 546,1315,
223
+ 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928,  14,2594, 557,
224
+3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,
225
+1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,
226
+4031,2641,4067,3145,1870,  37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,
227
+1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,
228
+2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,
229
+1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,
230
+ 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,
231
+1178,2639,2351,  93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,
232
+3341,1618,4126,2595,2334, 603, 651,  69, 701, 268,2662,3411,2555,1380,1606, 503,
233
+ 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,
234
+2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,
235
+ 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,
236
+1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,
237
+1281,  52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169,  27,
238
+1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,
239
+3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,
240
+2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,
241
+3891,2868,3621,2254,  58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,
242
+3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,
243
+3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,
244
+ 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,
245
+2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,
246
+ 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,
247
+2724,1927,2333,4440, 567,  22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,
248
+  12, 974,3783,4391, 951,1412,   1,3720, 453,4608,4041, 528,1041,1027,3230,2628,
249
+1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040,  31,
250
+ 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,
251
+ 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,
252
+1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,
253
+3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,
254
+3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118,  63,2076, 314,1881,
255
+1348,1061, 172, 978,3515,1747, 532, 511,3970,   6, 601, 905,2699,3300,1751, 276,
256
+1467,3725,2668,  65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,
257
+3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,
258
+2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,
259
+2754,  95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,
260
+1985, 244,2546, 474, 495,1046,2611,1851,2061,  71,2089,1675,2590, 742,3758,2843,
261
+3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,
262
+ 451,   3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,
263
+4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,
264
+1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,
265
+2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078,  49,3770,
266
+3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,
267
+3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,
268
+1197,1663,4476,3127,  85,4240,2528,  25,1111,1181,3673, 407,3470,4561,2679,2713,
269
+ 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,
270
+ 391,2963, 187,  61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,
271
+2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,
272
+ 931, 317,2517,3027, 325, 569, 686,2107,3084,  60,1042,1333,2794, 264,3177,4014,
273
+1628, 258,3712,   7,4464,1176,1043,1778, 683, 114,1975,  78,1492, 383,1886, 510,
274
+ 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,
275
+1282,1289,4609, 697,1453,3044,2666,3611,1856,2412,  54, 719,1330, 568,3778,2459,
276
+1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,
277
+1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,
278
+1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421,  56,1908,1640,2387,2232,
279
+1917,1874,2477,4921, 148,  83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,
280
+ 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,
281
+ 852,1221,1400,1486, 882,2299,4036, 351,  28,1122, 700,6479,6480,6481,6482,6483,  # last 512
282
+#Everything below is of no interest for detection purpose
283
+5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636,
284
+5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874,
285
+5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278,
286
+3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806,
287
+4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827,
288
+5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512,
289
+5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578,
290
+4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828,
291
+4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105,
292
+4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189,
293
+4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561,
294
+3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226,
295
+6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778,
296
+4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039,
297
+6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404,
298
+4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213,
299
+4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739,
300
+4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328,
301
+5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592,
302
+3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424,
303
+4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270,
304
+3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232,
305
+4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456,
306
+4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121,
307
+6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971,
308
+6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409,
309
+5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519,
310
+4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367,
311
+6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834,
312
+4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460,
313
+5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464,
314
+5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709,
315
+5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906,
316
+6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530,
317
+3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262,
318
+6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920,
319
+4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190,
320
+5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318,
321
+6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538,
322
+6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697,
323
+4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544,
324
+5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016,
325
+4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638,
326
+5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006,
327
+5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071,
328
+4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552,
329
+4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556,
330
+5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432,
331
+4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632,
332
+4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885,
333
+5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336,
334
+4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729,
335
+4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854,
336
+4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332,
337
+5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004,
338
+5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419,
339
+4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293,
340
+3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580,
341
+4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339,
342
+6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341,
343
+5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493,
344
+5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046,
345
+4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904,
346
+6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728,
347
+5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350,
348
+6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233,
349
+4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944,
350
+5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413,
351
+5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700,
352
+3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999,
353
+5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694,
354
+6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571,
355
+4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359,
356
+6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178,
357
+4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421,
358
+4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330,
359
+6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855,
360
+3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587,
361
+6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803,
362
+4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791,
363
+3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304,
364
+3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445,
365
+3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506,
366
+4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856,
367
+2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057,
368
+5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777,
369
+4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369,
370
+5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028,
371
+5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914,
372
+5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175,
373
+4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681,
374
+5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534,
375
+4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912,
376
+5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054,
377
+1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336,
378
+3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666,
379
+4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375,
380
+4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113,
381
+6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614,
382
+4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173,
383
+5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197,
384
+3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271,
385
+5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423,
386
+5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529,
387
+5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921,
388
+3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837,
389
+5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922,
390
+5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187,
391
+3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382,
392
+5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628,
393
+5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683,
394
+5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053,
395
+6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928,
396
+4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662,
397
+6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663,
398
+4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554,
399
+3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191,
400
+4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013,
401
+5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932,
402
+5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055,
403
+5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829,
404
+3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096,
405
+3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660,
406
+6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199,
407
+6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748,
408
+5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402,
409
+6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957,
410
+6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668,
411
+6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763,
412
+6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407,
413
+6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051,
414
+5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429,
415
+6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791,
416
+6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028,
417
+3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305,
418
+3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159,
419
+4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683,
420
+4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372,
421
+3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514,
422
+5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544,
423
+5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472,
424
+5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716,
425
+5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905,
426
+5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327,
427
+4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030,
428
+5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281,
429
+6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224,
430
+5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327,
431
+4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062,
432
+4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354,
433
+6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065,
434
+3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953,
435
+4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681,
436
+4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708,
437
+5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442,
438
+6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387,
439
+6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237,
440
+4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713,
441
+6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547,
442
+5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957,
443
+5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337,
444
+5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074,
445
+5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685,
446
+5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455,
447
+4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722,
448
+5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615,
449
+5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093,
450
+5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989,
451
+5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094,
452
+6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212,
453
+4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967,
454
+5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733,
455
+4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260,
456
+4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864,
457
+6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353,
458
+4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095,
459
+6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287,
460
+3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504,
461
+5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539,
462
+6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750,
463
+6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864,
464
+6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213,
465
+5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573,
466
+6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252,
467
+6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970,
468
+3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703,
469
+5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978,
470
+4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767)
471
+
472
+# flake8: noqa

+ 41
- 0
Contents/Libraries/Shared/requests/packages/chardet/gb2312prober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is mozilla.org code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+# 
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+# 
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from .mbcharsetprober import MultiByteCharSetProber
29
+from .codingstatemachine import CodingStateMachine
30
+from .chardistribution import GB2312DistributionAnalysis
31
+from .mbcssm import GB2312SMModel
32
+
33
+class GB2312Prober(MultiByteCharSetProber):
34
+    def __init__(self):
35
+        MultiByteCharSetProber.__init__(self)
36
+        self._mCodingSM = CodingStateMachine(GB2312SMModel)
37
+        self._mDistributionAnalyzer = GB2312DistributionAnalysis()
38
+        self.reset()
39
+
40
+    def get_charset_name(self):
41
+        return "GB2312"

+ 283
- 0
Contents/Libraries/Shared/requests/packages/chardet/hebrewprober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Universal charset detector code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+#          Shy Shalom
6
+# Portions created by the Initial Developer are Copyright (C) 2005
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from .charsetprober import CharSetProber
29
+from .constants import eNotMe, eDetecting
30
+from .compat import wrap_ord
31
+
32
+# This prober doesn't actually recognize a language or a charset.
33
+# It is a helper prober for the use of the Hebrew model probers
34
+
35
+### General ideas of the Hebrew charset recognition ###
36
+#
37
+# Four main charsets exist in Hebrew:
38
+# "ISO-8859-8" - Visual Hebrew
39
+# "windows-1255" - Logical Hebrew
40
+# "ISO-8859-8-I" - Logical Hebrew
41
+# "x-mac-hebrew" - ?? Logical Hebrew ??
42
+#
43
+# Both "ISO" charsets use a completely identical set of code points, whereas
44
+# "windows-1255" and "x-mac-hebrew" are two different proper supersets of
45
+# these code points. windows-1255 defines additional characters in the range
46
+# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific
47
+# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.
48
+# x-mac-hebrew defines similar additional code points but with a different
49
+# mapping.
50
+#
51
+# As far as an average Hebrew text with no diacritics is concerned, all four
52
+# charsets are identical with respect to code points. Meaning that for the
53
+# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters
54
+# (including final letters).
55
+#
56
+# The dominant difference between these charsets is their directionality.
57
+# "Visual" directionality means that the text is ordered as if the renderer is
58
+# not aware of a BIDI rendering algorithm. The renderer sees the text and
59
+# draws it from left to right. The text itself when ordered naturally is read
60
+# backwards. A buffer of Visual Hebrew generally looks like so:
61
+# "[last word of first line spelled backwards] [whole line ordered backwards
62
+# and spelled backwards] [first word of first line spelled backwards]
63
+# [end of line] [last word of second line] ... etc' "
64
+# adding punctuation marks, numbers and English text to visual text is
65
+# naturally also "visual" and from left to right.
66
+#
67
+# "Logical" directionality means the text is ordered "naturally" according to
68
+# the order it is read. It is the responsibility of the renderer to display
69
+# the text from right to left. A BIDI algorithm is used to place general
70
+# punctuation marks, numbers and English text in the text.
71
+#
72
+# Texts in x-mac-hebrew are almost impossible to find on the Internet. From
73
+# what little evidence I could find, it seems that its general directionality
74
+# is Logical.
75
+#
76
+# To sum up all of the above, the Hebrew probing mechanism knows about two
77
+# charsets:
78
+# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are
79
+#    backwards while line order is natural. For charset recognition purposes
80
+#    the line order is unimportant (In fact, for this implementation, even
81
+#    word order is unimportant).
82
+# Logical Hebrew - "windows-1255" - normal, naturally ordered text.
83
+#
84
+# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be
85
+#    specifically identified.
86
+# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew
87
+#    that contain special punctuation marks or diacritics is displayed with
88
+#    some unconverted characters showing as question marks. This problem might
89
+#    be corrected using another model prober for x-mac-hebrew. Due to the fact
90
+#    that x-mac-hebrew texts are so rare, writing another model prober isn't
91
+#    worth the effort and performance hit.
92
+#
93
+#### The Prober ####
94
+#
95
+# The prober is divided between two SBCharSetProbers and a HebrewProber,
96
+# all of which are managed, created, fed data, inquired and deleted by the
97
+# SBCSGroupProber. The two SBCharSetProbers identify that the text is in
98
+# fact some kind of Hebrew, Logical or Visual. The final decision about which
99
+# one is it is made by the HebrewProber by combining final-letter scores
100
+# with the scores of the two SBCharSetProbers to produce a final answer.
101
+#
102
+# The SBCSGroupProber is responsible for stripping the original text of HTML
103
+# tags, English characters, numbers, low-ASCII punctuation characters, spaces
104
+# and new lines. It reduces any sequence of such characters to a single space.
105
+# The buffer fed to each prober in the SBCS group prober is pure text in
106
+# high-ASCII.
107
+# The two SBCharSetProbers (model probers) share the same language model:
108
+# Win1255Model.
109
+# The first SBCharSetProber uses the model normally as any other
110
+# SBCharSetProber does, to recognize windows-1255, upon which this model was
111
+# built. The second SBCharSetProber is told to make the pair-of-letter
112
+# lookup in the language model backwards. This in practice exactly simulates
113
+# a visual Hebrew model using the windows-1255 logical Hebrew model.
114
+#
115
+# The HebrewProber is not using any language model. All it does is look for
116
+# final-letter evidence suggesting the text is either logical Hebrew or visual
117
+# Hebrew. Disjointed from the model probers, the results of the HebrewProber
118
+# alone are meaningless. HebrewProber always returns 0.00 as confidence
119
+# since it never identifies a charset by itself. Instead, the pointer to the
120
+# HebrewProber is passed to the model probers as a helper "Name Prober".
121
+# When the Group prober receives a positive identification from any prober,
122
+# it asks for the name of the charset identified. If the prober queried is a
123
+# Hebrew model prober, the model prober forwards the call to the
124
+# HebrewProber to make the final decision. In the HebrewProber, the
125
+# decision is made according to the final-letters scores maintained and Both
126
+# model probers scores. The answer is returned in the form of the name of the
127
+# charset identified, either "windows-1255" or "ISO-8859-8".
128
+
129
+# windows-1255 / ISO-8859-8 code points of interest
130
+FINAL_KAF = 0xea
131
+NORMAL_KAF = 0xeb
132
+FINAL_MEM = 0xed
133
+NORMAL_MEM = 0xee
134
+FINAL_NUN = 0xef
135
+NORMAL_NUN = 0xf0
136
+FINAL_PE = 0xf3
137
+NORMAL_PE = 0xf4
138
+FINAL_TSADI = 0xf5
139
+NORMAL_TSADI = 0xf6
140
+
141
+# Minimum Visual vs Logical final letter score difference.
142
+# If the difference is below this, don't rely solely on the final letter score
143
+# distance.
144
+MIN_FINAL_CHAR_DISTANCE = 5
145
+
146
+# Minimum Visual vs Logical model score difference.
147
+# If the difference is below this, don't rely at all on the model score
148
+# distance.
149
+MIN_MODEL_DISTANCE = 0.01
150
+
151
+VISUAL_HEBREW_NAME = "ISO-8859-8"
152
+LOGICAL_HEBREW_NAME = "windows-1255"
153
+
154
+
155
+class HebrewProber(CharSetProber):
156
+    def __init__(self):
157
+        CharSetProber.__init__(self)
158
+        self._mLogicalProber = None
159
+        self._mVisualProber = None
160
+        self.reset()
161
+
162
+    def reset(self):
163
+        self._mFinalCharLogicalScore = 0
164
+        self._mFinalCharVisualScore = 0
165
+        # The two last characters seen in the previous buffer,
166
+        # mPrev and mBeforePrev are initialized to space in order to simulate
167
+        # a word delimiter at the beginning of the data
168
+        self._mPrev = ' '
169
+        self._mBeforePrev = ' '
170
+        # These probers are owned by the group prober.
171
+
172
+    def set_model_probers(self, logicalProber, visualProber):
173
+        self._mLogicalProber = logicalProber
174
+        self._mVisualProber = visualProber
175
+
176
+    def is_final(self, c):
177
+        return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE,
178
+                               FINAL_TSADI]
179
+
180
+    def is_non_final(self, c):
181
+        # The normal Tsadi is not a good Non-Final letter due to words like
182
+        # 'lechotet' (to chat) containing an apostrophe after the tsadi. This
183
+        # apostrophe is converted to a space in FilterWithoutEnglishLetters
184
+        # causing the Non-Final tsadi to appear at an end of a word even
185
+        # though this is not the case in the original text.
186
+        # The letters Pe and Kaf rarely display a related behavior of not being
187
+        # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak'
188
+        # for example legally end with a Non-Final Pe or Kaf. However, the
189
+        # benefit of these letters as Non-Final letters outweighs the damage
190
+        # since these words are quite rare.
191
+        return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE]
192
+
193
+    def feed(self, aBuf):
194
+        # Final letter analysis for logical-visual decision.
195
+        # Look for evidence that the received buffer is either logical Hebrew
196
+        # or visual Hebrew.
197
+        # The following cases are checked:
198
+        # 1) A word longer than 1 letter, ending with a final letter. This is
199
+        #    an indication that the text is laid out "naturally" since the
200
+        #    final letter really appears at the end. +1 for logical score.
201
+        # 2) A word longer than 1 letter, ending with a Non-Final letter. In
202
+        #    normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi,
203
+        #    should not end with the Non-Final form of that letter. Exceptions
204
+        #    to this rule are mentioned above in isNonFinal(). This is an
205
+        #    indication that the text is laid out backwards. +1 for visual
206
+        #    score
207
+        # 3) A word longer than 1 letter, starting with a final letter. Final
208
+        #    letters should not appear at the beginning of a word. This is an
209
+        #    indication that the text is laid out backwards. +1 for visual
210
+        #    score.
211
+        #
212
+        # The visual score and logical score are accumulated throughout the
213
+        # text and are finally checked against each other in GetCharSetName().
214
+        # No checking for final letters in the middle of words is done since
215
+        # that case is not an indication for either Logical or Visual text.
216
+        #
217
+        # We automatically filter out all 7-bit characters (replace them with
218
+        # spaces) so the word boundary detection works properly. [MAP]
219
+
220
+        if self.get_state() == eNotMe:
221
+            # Both model probers say it's not them. No reason to continue.
222
+            return eNotMe
223
+
224
+        aBuf = self.filter_high_bit_only(aBuf)
225
+
226
+        for cur in aBuf:
227
+            if cur == ' ':
228
+                # We stand on a space - a word just ended
229
+                if self._mBeforePrev != ' ':
230
+                    # next-to-last char was not a space so self._mPrev is not a
231
+                    # 1 letter word
232
+                    if self.is_final(self._mPrev):
233
+                        # case (1) [-2:not space][-1:final letter][cur:space]
234
+                        self._mFinalCharLogicalScore += 1
235
+                    elif self.is_non_final(self._mPrev):
236
+                        # case (2) [-2:not space][-1:Non-Final letter][
237
+                        #  cur:space]
238
+                        self._mFinalCharVisualScore += 1
239
+            else:
240
+                # Not standing on a space
241
+                if ((self._mBeforePrev == ' ') and
242
+                        (self.is_final(self._mPrev)) and (cur != ' ')):
243
+                    # case (3) [-2:space][-1:final letter][cur:not space]
244
+                    self._mFinalCharVisualScore += 1
245
+            self._mBeforePrev = self._mPrev
246
+            self._mPrev = cur
247
+
248
+        # Forever detecting, till the end or until both model probers return
249
+        # eNotMe (handled above)
250
+        return eDetecting
251
+
252
+    def get_charset_name(self):
253
+        # Make the decision: is it Logical or Visual?
254
+        # If the final letter score distance is dominant enough, rely on it.
255
+        finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore
256
+        if finalsub >= MIN_FINAL_CHAR_DISTANCE:
257
+            return LOGICAL_HEBREW_NAME
258
+        if finalsub <= -MIN_FINAL_CHAR_DISTANCE:
259
+            return VISUAL_HEBREW_NAME
260
+
261
+        # It's not dominant enough, try to rely on the model scores instead.
262
+        modelsub = (self._mLogicalProber.get_confidence()
263
+                    - self._mVisualProber.get_confidence())
264
+        if modelsub > MIN_MODEL_DISTANCE:
265
+            return LOGICAL_HEBREW_NAME
266
+        if modelsub < -MIN_MODEL_DISTANCE:
267
+            return VISUAL_HEBREW_NAME
268
+
269
+        # Still no good, back to final letter distance, maybe it'll save the
270
+        # day.
271
+        if finalsub < 0.0:
272
+            return VISUAL_HEBREW_NAME
273
+
274
+        # (finalsub > 0 - Logical) or (don't know what to do) default to
275
+        # Logical.
276
+        return LOGICAL_HEBREW_NAME
277
+
278
+    def get_state(self):
279
+        # Remain active as long as any of the model probers are active.
280
+        if (self._mLogicalProber.get_state() == eNotMe) and \
281
+           (self._mVisualProber.get_state() == eNotMe):
282
+            return eNotMe
283
+        return eDetecting

+ 569
- 0
Contents/Libraries/Shared/requests/packages/chardet/jisfreq.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+# Sampling from about 20M text materials include literature and computer technology
29
+#
30
+# Japanese frequency table, applied to both S-JIS and EUC-JP
31
+# They are sorted in order.
32
+
33
+# 128  --> 0.77094
34
+# 256  --> 0.85710
35
+# 512  --> 0.92635
36
+# 1024 --> 0.97130
37
+# 2048 --> 0.99431
38
+#
39
+# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58
40
+# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191
41
+#
42
+# Typical Distribution Ratio, 25% of IDR
43
+
44
+JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0
45
+
46
+# Char to FreqOrder table ,
47
+JIS_TABLE_SIZE = 4368
48
+
49
+JISCharToFreqOrder = (
50
+  40,   1,   6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, #   16
51
+3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247,  18, 179,5071, 856,1661, #   32
52
+1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, #   48
53
+2042,1061,1062,  48,  49,  44,  45, 433, 434,1040,1041, 996, 787,2997,1255,4305, #   64
54
+2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, #   80
55
+5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, #   96
56
+1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, #  112
57
+5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, #  128
58
+5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, #  144
59
+5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, #  160
60
+5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, #  176
61
+5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, #  192
62
+5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, #  208
63
+1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, #  224
64
+1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, #  240
65
+1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, #  256
66
+2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, #  272
67
+3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161,  26,3377,   2,3929,  20, #  288
68
+3691,  47,4100,  50,  17,  16,  35, 268,  27, 243,  42, 155,  24, 154,  29, 184, #  304
69
+   4,  91,  14,  92,  53, 396,  33, 289,   9,  37,  64, 620,  21,  39, 321,   5, #  320
70
+  12,  11,  52,  13,   3, 208, 138,   0,   7,  60, 526, 141, 151,1069, 181, 275, #  336
71
+1591,  83, 132,1475, 126, 331, 829,  15,  69, 160,  59,  22, 157,  55,1079, 312, #  352
72
+ 109,  38,  23,  25,  10,  19,  79,5195,  61, 382,1124,   8,  30,5196,5197,5198, #  368
73
+5199,5200,5201,5202,5203,5204,5205,5206,  89,  62,  74,  34,2416, 112, 139, 196, #  384
74
+ 271, 149,  84, 607, 131, 765,  46,  88, 153, 683,  76, 874, 101, 258,  57,  80, #  400
75
+  32, 364, 121,1508, 169,1547,  68, 235, 145,2999,  41, 360,3027,  70,  63,  31, #  416
76
+  43, 259, 262,1383,  99, 533, 194,  66,  93, 846, 217, 192,  56, 106,  58, 565, #  432
77
+ 280, 272, 311, 256, 146,  82, 308,  71, 100, 128, 214, 655, 110, 261, 104,1140, #  448
78
+  54,  51,  36,  87,  67,3070, 185,2618,2936,2020,  28,1066,2390,2059,5207,5208, #  464
79
+5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, #  480
80
+5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, #  496
81
+5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, #  512
82
+4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, #  528
83
+5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, #  544
84
+5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, #  560
85
+5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, #  576
86
+5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, #  592
87
+5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, #  608
88
+5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, #  624
89
+5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, #  640
90
+5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, #  656
91
+5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, #  672
92
+3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, #  688
93
+5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, #  704
94
+5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, #  720
95
+5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, #  736
96
+5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, #  752
97
+5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, #  768
98
+5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, #  784
99
+5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, #  800
100
+5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, #  816
101
+5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, #  832
102
+5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, #  848
103
+5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, #  864
104
+5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, #  880
105
+5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, #  896
106
+5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, #  912
107
+5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, #  928
108
+5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, #  944
109
+5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, #  960
110
+5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, #  976
111
+5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, #  992
112
+5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008
113
+5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024
114
+5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040
115
+5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056
116
+5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072
117
+5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088
118
+5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104
119
+5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120
120
+5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136
121
+5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152
122
+5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168
123
+5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184
124
+5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200
125
+5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216
126
+5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232
127
+5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248
128
+5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264
129
+5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280
130
+5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296
131
+6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312
132
+6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328
133
+6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344
134
+6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360
135
+6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376
136
+6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392
137
+6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408
138
+6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424
139
+4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440
140
+ 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456
141
+ 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472
142
+1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619,  65,3302,2045, # 1488
143
+1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504
144
+ 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520
145
+3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536
146
+3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552
147
+ 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568
148
+3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584
149
+3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600
150
+ 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616
151
+2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632
152
+ 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648
153
+3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664
154
+1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680
155
+ 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696
156
+1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712
157
+ 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728
158
+2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744
159
+2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760
160
+2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776
161
+2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792
162
+1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808
163
+1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824
164
+1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840
165
+1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856
166
+2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872
167
+1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888
168
+2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904
169
+1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920
170
+1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936
171
+1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952
172
+1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968
173
+1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984
174
+1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000
175
+ 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016
176
+ 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032
177
+1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048
178
+2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064
179
+2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080
180
+2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096
181
+3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112
182
+3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128
183
+ 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144
184
+3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160
185
+1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876,  78,2287,1482,1277, # 2176
186
+ 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192
187
+2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208
188
+1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224
189
+ 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240
190
+3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256
191
+4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272
192
+2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288
193
+1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304
194
+2601,1919,1078,  75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320
195
+1075, 292,3818,1756,2602, 317,  98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336
196
+ 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352
197
+ 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368
198
+1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384
199
+2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400
200
+2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416
201
+2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432
202
+3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448
203
+1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464
204
+2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480
205
+ 359,2291,1676,  73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496
206
+ 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512
207
+ 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528
208
+1209,  96, 587,2166,1032, 260,1072,2153, 173,  94, 226,3244, 819,2006,4642,4114, # 2544
209
+2203, 231,1744, 782,  97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560
210
+ 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576
211
+1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592
212
+1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608
213
+ 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624
214
+1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640
215
+1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656
216
+1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672
217
+ 764,2861,1853, 688,2429,1920,1462,  77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688
218
+2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704
219
+ 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720
220
+2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736
221
+3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752
222
+2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768
223
+1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784
224
+6147, 441, 762,1771,3447,3607,3608,1904, 840,3037,  86, 939,1385, 572,1370,2445, # 2800
225
+1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816
226
+2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832
227
+1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848
228
+ 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864
229
+  72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880
230
+3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896
231
+3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912
232
+1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928
233
+1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944
234
+1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960
235
+1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976
236
+ 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992
237
+ 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008
238
+2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024
239
+ 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040
240
+3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056
241
+2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072
242
+ 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088
243
+1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104
244
+2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120
245
+ 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136
246
+1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152
247
+ 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168
248
+4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184
249
+2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200
250
+1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216
251
+ 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232
252
+1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248
253
+2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264
254
+ 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280
255
+6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296
256
+1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312
257
+1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328
258
+2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344
259
+3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360
260
+ 914,2550,2587,  81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376
261
+3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392
262
+1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408
263
+ 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424
264
+1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440
265
+ 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456
266
+3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472
267
+ 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488
268
+2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504
269
+ 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520
270
+4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536
271
+2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552
272
+1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568
273
+1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584
274
+1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600
275
+ 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616
276
+1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632
277
+3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648
278
+1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664
279
+3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680
280
+ 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696
281
+ 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712
282
+ 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728
283
+2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744
284
+1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760
285
+ 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776
286
+1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792
287
+ 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808
288
+1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824
289
+ 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840
290
+ 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856
291
+ 480,2083,1774,3458, 923,2279,1350, 221,3086,  85,2233,2234,3835,1585,3010,2147, # 3872
292
+1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888
293
+1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904
294
+2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920
295
+4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936
296
+ 227,1351,1645,2453,2193,1421,2887, 812,2121, 634,  95,2435, 201,2312,4665,1646, # 3952
297
+1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968
298
+ 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984
299
+1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000
300
+3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016
301
+1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032
302
+2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048
303
+2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064
304
+1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080
305
+1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096
306
+2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112
307
+ 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128
308
+2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144
309
+1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160
310
+1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176
311
+1279,2136,1697,2335, 204, 721,2097,3838,  90,6186,2085,2505, 191,3967, 124,2148, # 4192
312
+1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208
313
+3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224
314
+2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240
315
+2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256
316
+ 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272
317
+3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288
318
+3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304
319
+1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320
320
+2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336
321
+1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352
322
+2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368  #last 512
323
+#Everything below is of no interest for detection purpose
324
+2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384
325
+6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400
326
+6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416
327
+6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432
328
+6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448
329
+4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464
330
+4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480
331
+3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496
332
+3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512
333
+4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528
334
+3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544
335
+6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560
336
+4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576
337
+6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592
338
+6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608
339
+6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624
340
+6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640
341
+6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656
342
+6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672
343
+3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688
344
+3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704
345
+6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720
346
+2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736
347
+4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752
348
+4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768
349
+4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784
350
+6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800
351
+3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816
352
+4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832
353
+4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848
354
+6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864
355
+4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880
356
+6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896
357
+3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912
358
+2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928
359
+4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944
360
+2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960
361
+6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976
362
+4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992
363
+6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008
364
+6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024
365
+6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040
366
+4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056
367
+6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072
368
+2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088
369
+6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104
370
+4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120
371
+6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136
372
+4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152
373
+4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168
374
+6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184
375
+6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200
376
+6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216
377
+3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232
378
+1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248
379
+3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264
380
+3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280
381
+4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296
382
+6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312
383
+3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328
384
+6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344
385
+3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360
386
+3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376
387
+2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392
388
+6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408
389
+6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424
390
+3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440
391
+6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456
392
+3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472
393
+6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488
394
+6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504
395
+6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520
396
+4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536
397
+6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552
398
+4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568
399
+3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584
400
+3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600
401
+6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616
402
+6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632
403
+4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648
404
+6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664
405
+6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680
406
+6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696
407
+6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712
408
+6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728
409
+6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744
410
+4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760
411
+4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776
412
+3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792
413
+6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808
414
+4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824
415
+2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840
416
+6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856
417
+6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872
418
+4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888
419
+2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904
420
+4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920
421
+2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936
422
+4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952
423
+4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968
424
+4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984
425
+6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000
426
+3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016
427
+6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032
428
+3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048
429
+6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064
430
+2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080
431
+3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096
432
+7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112
433
+2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128
434
+3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144
435
+3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160
436
+3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176
437
+3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192
438
+7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208
439
+7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224
440
+7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240
441
+7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256
442
+7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272
443
+4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288
444
+3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304
445
+3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320
446
+4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336
447
+3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352
448
+3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368
449
+7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384
450
+4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400
451
+7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416
452
+7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432
453
+7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448
454
+7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464
455
+7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480
456
+4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496
457
+4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512
458
+7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528
459
+3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544
460
+4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560
461
+7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576
462
+7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592
463
+4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608
464
+3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624
465
+3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640
466
+7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656
467
+4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672
468
+4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688
469
+4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704
470
+4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720
471
+4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736
472
+4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752
473
+7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768
474
+7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784
475
+7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800
476
+7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816
477
+7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832
478
+2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848
479
+3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864
480
+7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880
481
+7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896
482
+3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912
483
+4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928
484
+3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944
485
+3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960
486
+2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976
487
+7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992
488
+7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008
489
+4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024
490
+3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040
491
+3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056
492
+7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072
493
+7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088
494
+7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104
495
+4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120
496
+7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136
497
+2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152
498
+3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168
499
+4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184
500
+7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200
501
+4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216
502
+4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232
503
+7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248
504
+7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264
505
+5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280
506
+7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296
507
+7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312
508
+7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328
509
+7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344
510
+7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360
511
+5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376
512
+5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392
513
+7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408
514
+3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424
515
+7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440
516
+7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456
517
+3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472
518
+7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488
519
+7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504
520
+1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520
521
+3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536
522
+4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552
523
+2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568
524
+3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584
525
+2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600
526
+5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616
527
+4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632
528
+4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648
529
+5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664
530
+7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680
531
+7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696
532
+7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712
533
+7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728
534
+3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744
535
+7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760
536
+3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776
537
+7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792
538
+4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808
539
+7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824
540
+7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840
541
+7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856
542
+7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872
543
+7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888
544
+7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904
545
+7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920
546
+7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936
547
+7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952
548
+7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968
549
+7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984
550
+7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000
551
+8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016
552
+8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032
553
+8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048
554
+8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064
555
+8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080
556
+8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096
557
+8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112
558
+8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128
559
+8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144
560
+8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160
561
+8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176
562
+8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192
563
+8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208
564
+8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224
565
+8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240
566
+8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256
567
+8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272
568
+
569
+# flake8: noqa

+ 227
- 0
Contents/Libraries/Shared/requests/packages/chardet/jpcntx.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from .compat import wrap_ord
29
+
30
+NUM_OF_CATEGORY = 6
31
+DONT_KNOW = -1
32
+ENOUGH_REL_THRESHOLD = 100
33
+MAX_REL_THRESHOLD = 1000
34
+MINIMUM_DATA_THRESHOLD = 4
35
+
36
+# This is hiragana 2-char sequence table, the number in each cell represents its frequency category
37
+jp2CharContext = (
38
+(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),
39
+(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),
40
+(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),
41
+(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),
42
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
43
+(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),
44
+(0,0,0,0,0,0,0,0,0,0,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),
45
+(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),
46
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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),
47
+(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),
48
+(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),
49
+(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),
50
+(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),
51
+(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),
52
+(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),
53
+(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),
54
+(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),
55
+(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),
56
+(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),
57
+(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),
58
+(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),
59
+(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),
60
+(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),
61
+(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),
62
+(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),
63
+(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),
64
+(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),
65
+(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),
66
+(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),
67
+(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),
68
+(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),
69
+(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),
70
+(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),
71
+(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),
72
+(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),
73
+(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),
74
+(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),
75
+(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),
76
+(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),
77
+(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),
78
+(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),
79
+(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),
80
+(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),
81
+(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),
82
+(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),
83
+(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),
84
+(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),
85
+(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),
86
+(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),
87
+(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),
88
+(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),
89
+(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),
90
+(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),
91
+(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),
92
+(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),
93
+(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),
94
+(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),
95
+(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),
96
+(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),
97
+(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),
98
+(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),
99
+(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),
100
+(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),
101
+(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),
102
+(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),
103
+(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),
104
+(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),
105
+(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),
106
+(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),
107
+(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),
108
+(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),
109
+(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),
110
+(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),
111
+(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),
112
+(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),
113
+(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),
114
+(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),
115
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
116
+(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),
117
+(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),
118
+(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),
119
+(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),
120
+(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),
121
+)
122
+
123
+class JapaneseContextAnalysis:
124
+    def __init__(self):
125
+        self.reset()
126
+
127
+    def reset(self):
128
+        self._mTotalRel = 0  # total sequence received
129
+        # category counters, each interger counts sequence in its category
130
+        self._mRelSample = [0] * NUM_OF_CATEGORY
131
+        # if last byte in current buffer is not the last byte of a character,
132
+        # we need to know how many bytes to skip in next buffer
133
+        self._mNeedToSkipCharNum = 0
134
+        self._mLastCharOrder = -1  # The order of previous char
135
+        # If this flag is set to True, detection is done and conclusion has
136
+        # been made
137
+        self._mDone = False
138
+
139
+    def feed(self, aBuf, aLen):
140
+        if self._mDone:
141
+            return
142
+
143
+        # The buffer we got is byte oriented, and a character may span in more than one
144
+        # buffers. In case the last one or two byte in last buffer is not
145
+        # complete, we record how many byte needed to complete that character
146
+        # and skip these bytes here.  We can choose to record those bytes as
147
+        # well and analyse the character once it is complete, but since a
148
+        # character will not make much difference, by simply skipping
149
+        # this character will simply our logic and improve performance.
150
+        i = self._mNeedToSkipCharNum
151
+        while i < aLen:
152
+            order, charLen = self.get_order(aBuf[i:i + 2])
153
+            i += charLen
154
+            if i > aLen:
155
+                self._mNeedToSkipCharNum = i - aLen
156
+                self._mLastCharOrder = -1
157
+            else:
158
+                if (order != -1) and (self._mLastCharOrder != -1):
159
+                    self._mTotalRel += 1
160
+                    if self._mTotalRel > MAX_REL_THRESHOLD:
161
+                        self._mDone = True
162
+                        break
163
+                    self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1
164
+                self._mLastCharOrder = order
165
+
166
+    def got_enough_data(self):
167
+        return self._mTotalRel > ENOUGH_REL_THRESHOLD
168
+
169
+    def get_confidence(self):
170
+        # This is just one way to calculate confidence. It works well for me.
171
+        if self._mTotalRel > MINIMUM_DATA_THRESHOLD:
172
+            return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel
173
+        else:
174
+            return DONT_KNOW
175
+
176
+    def get_order(self, aBuf):
177
+        return -1, 1
178
+
179
+class SJISContextAnalysis(JapaneseContextAnalysis):
180
+    def __init__(self):
181
+        self.charset_name = "SHIFT_JIS"
182
+
183
+    def get_charset_name(self):
184
+        return self.charset_name
185
+
186
+    def get_order(self, aBuf):
187
+        if not aBuf:
188
+            return -1, 1
189
+        # find out current char's byte length
190
+        first_char = wrap_ord(aBuf[0])
191
+        if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)):
192
+            charLen = 2
193
+            if (first_char == 0x87) or (0xFA <= first_char <= 0xFC):
194
+                self.charset_name = "CP932"
195
+        else:
196
+            charLen = 1
197
+
198
+        # return its order if it is hiragana
199
+        if len(aBuf) > 1:
200
+            second_char = wrap_ord(aBuf[1])
201
+            if (first_char == 202) and (0x9F <= second_char <= 0xF1):
202
+                return second_char - 0x9F, charLen
203
+
204
+        return -1, charLen
205
+
206
+class EUCJPContextAnalysis(JapaneseContextAnalysis):
207
+    def get_order(self, aBuf):
208
+        if not aBuf:
209
+            return -1, 1
210
+        # find out current char's byte length
211
+        first_char = wrap_ord(aBuf[0])
212
+        if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE):
213
+            charLen = 2
214
+        elif first_char == 0x8F:
215
+            charLen = 3
216
+        else:
217
+            charLen = 1
218
+
219
+        # return its order if it is hiragana
220
+        if len(aBuf) > 1:
221
+            second_char = wrap_ord(aBuf[1])
222
+            if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3):
223
+                return second_char - 0xA1, charLen
224
+
225
+        return -1, charLen
226
+
227
+# flake8: noqa

+ 229
- 0
Contents/Libraries/Shared/requests/packages/chardet/langbulgarianmodel.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+# 255: Control characters that usually does not exist in any text
29
+# 254: Carriage/Return
30
+# 253: symbol (punctuation) that does not belong to word
31
+# 252: 0 - 9
32
+
33
+# Character Mapping Table:
34
+# this table is modified base on win1251BulgarianCharToOrderMap, so
35
+# only number <64 is sure valid
36
+
37
+Latin5_BulgarianCharToOrderMap = (
38
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
39
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
40
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
41
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
42
+253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
43
+110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
44
+253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
45
+116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
46
+194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,  # 80
47
+210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,  # 90
48
+ 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238,  # a0
49
+ 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # b0
50
+ 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56,  # c0
51
+  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # d0
52
+  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16,  # e0
53
+ 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253,  # f0
54
+)
55
+
56
+win1251BulgarianCharToOrderMap = (
57
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
58
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
59
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
60
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
61
+253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82,  # 40
62
+110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253,  # 50
63
+253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71,  # 60
64
+116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253,  # 70
65
+206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220,  # 80
66
+221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229,  # 90
67
+ 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240,  # a0
68
+ 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250,  # b0
69
+ 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30,  # c0
70
+ 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56,  # d0
71
+  1, 18,  9, 20, 11,  3, 23, 15,  2, 26, 12, 10, 14,  6,  4, 13,  # e0
72
+  7,  8,  5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16,  # f0
73
+)
74
+
75
+# Model Table:
76
+# total sequences: 100%
77
+# first 512 sequences: 96.9392%
78
+# first 1024 sequences:3.0618%
79
+# rest  sequences:     0.2992%
80
+# negative sequences:  0.0020%
81
+BulgarianLangModel = (
82
+0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3,
83
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2,
84
+3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1,
85
+0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
86
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0,
87
+0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
88
+3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
89
+0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
90
+3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0,
91
+0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
92
+3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0,
93
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
94
+3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0,
95
+0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
96
+3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0,
97
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
98
+3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0,
99
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
100
+3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0,
101
+1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
102
+3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0,
103
+0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
104
+3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0,
105
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
106
+3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0,
107
+0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
108
+3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0,
109
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
110
+3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1,
111
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
112
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0,
113
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
114
+3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0,
115
+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,
116
+1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0,
117
+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,
118
+2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0,
119
+0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
120
+3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0,
121
+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,
122
+3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0,
123
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
124
+3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0,
125
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
126
+3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0,
127
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
128
+3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0,
129
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
130
+2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0,
131
+0,0,0,0,0,0,0,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,
132
+3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0,
133
+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,
134
+3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0,
135
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
136
+3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0,
137
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
138
+3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3,
139
+2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1,
140
+3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0,
141
+0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,
142
+3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2,
143
+1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0,
144
+3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1,
145
+1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0,
146
+2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2,
147
+2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0,
148
+3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2,
149
+1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0,
150
+2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2,
151
+2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
152
+3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2,
153
+1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0,
154
+2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2,
155
+2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0,
156
+2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2,
157
+1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0,
158
+2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2,
159
+1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,
160
+3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2,
161
+1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0,
162
+3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1,
163
+1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0,
164
+2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1,
165
+1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0,
166
+2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0,
167
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
168
+2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2,
169
+1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,
170
+2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1,
171
+1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0,
172
+3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
173
+1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
174
+2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2,
175
+1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1,
176
+2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2,
177
+1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,
178
+2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2,
179
+1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
180
+1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1,
181
+0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
182
+1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2,
183
+1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
184
+2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1,
185
+1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,
186
+1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
187
+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,
188
+2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1,
189
+0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
190
+1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1,
191
+0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
192
+2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
193
+0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
194
+2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0,
195
+1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
196
+2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
197
+0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
198
+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,
199
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
200
+1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
201
+0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
202
+1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1,
203
+1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
204
+0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
205
+1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,
206
+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,
207
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
208
+1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,
209
+0,0,0,0,0,0,0,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,
210
+)
211
+
212
+Latin5BulgarianModel = {
213
+  'charToOrderMap': Latin5_BulgarianCharToOrderMap,
214
+  'precedenceMatrix': BulgarianLangModel,
215
+  'mTypicalPositiveRatio': 0.969392,
216
+  'keepEnglishLetter': False,
217
+  'charsetName': "ISO-8859-5"
218
+}
219
+
220
+Win1251BulgarianModel = {
221
+  'charToOrderMap': win1251BulgarianCharToOrderMap,
222
+  'precedenceMatrix': BulgarianLangModel,
223
+  'mTypicalPositiveRatio': 0.969392,
224
+  'keepEnglishLetter': False,
225
+  'charsetName': "windows-1251"
226
+}
227
+
228
+
229
+# flake8: noqa

+ 329
- 0
Contents/Libraries/Shared/requests/packages/chardet/langcyrillicmodel.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+# KOI8-R language model
29
+# Character Mapping Table:
30
+KOI8R_CharToOrderMap = (
31
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
32
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
33
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
34
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
35
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
36
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
37
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
38
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
39
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,  # 80
40
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,  # 90
41
+223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237,  # a0
42
+238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,  # b0
43
+ 27,  3, 21, 28, 13,  2, 39, 19, 26,  4, 23, 11,  8, 12,  5,  1,  # c0
44
+ 15, 16,  9,  7,  6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54,  # d0
45
+ 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34,  # e0
46
+ 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70,  # f0
47
+)
48
+
49
+win1251_CharToOrderMap = (
50
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
51
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
52
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
53
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
54
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
55
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
56
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
57
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
58
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
59
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
60
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
61
+239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253,
62
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
63
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
64
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
65
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
66
+)
67
+
68
+latin5_CharToOrderMap = (
69
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
70
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
71
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
72
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
73
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
74
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
75
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
76
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
77
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
78
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
79
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
80
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
81
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
82
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
83
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
84
+239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
85
+)
86
+
87
+macCyrillic_CharToOrderMap = (
88
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
89
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
90
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
91
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
92
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
93
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
94
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
95
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
96
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
97
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
98
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
99
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
100
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
101
+239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16,
102
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
103
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255,
104
+)
105
+
106
+IBM855_CharToOrderMap = (
107
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
108
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
109
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
110
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
111
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
112
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
113
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
114
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
115
+191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205,
116
+206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70,
117
+  3, 37, 21, 44, 28, 58, 13, 41,  2, 48, 39, 53, 19, 46,218,219,
118
+220,221,222,223,224, 26, 55,  4, 42,225,226,227,228, 23, 60,229,
119
+230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243,
120
+  8, 49, 12, 38,  5, 31,  1, 34, 15,244,245,246,247, 35, 16,248,
121
+ 43,  9, 45,  7, 32,  6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249,
122
+250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255,
123
+)
124
+
125
+IBM866_CharToOrderMap = (
126
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
127
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
128
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
129
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
130
+253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154,  # 40
131
+155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253,  # 50
132
+253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69,  # 60
133
+ 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253,  # 70
134
+ 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35,
135
+ 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43,
136
+  3, 21, 10, 19, 13,  2, 24, 20,  4, 23, 11,  8, 12,  5,  1, 15,
137
+191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
138
+207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,
139
+223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,
140
+  9,  7,  6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16,
141
+239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255,
142
+)
143
+
144
+# Model Table:
145
+# total sequences: 100%
146
+# first 512 sequences: 97.6601%
147
+# first 1024 sequences: 2.3389%
148
+# rest  sequences:      0.1237%
149
+# negative sequences:   0.0009%
150
+RussianLangModel = (
151
+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,
152
+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,
153
+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,
154
+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,
155
+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,
156
+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,
157
+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,
158
+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,
159
+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,
160
+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,
161
+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,
162
+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,
163
+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,
164
+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,
165
+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,
166
+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,
167
+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,
168
+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,
169
+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,
170
+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,
171
+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,
172
+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,
173
+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,
174
+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,
175
+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,
176
+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,
177
+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,
178
+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,
179
+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,
180
+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,
181
+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,
182
+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,
183
+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,
184
+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,
185
+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,
186
+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,
187
+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,
188
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
189
+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,
190
+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,
191
+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,
192
+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,
193
+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,
194
+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,
195
+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,
196
+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,
197
+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,
198
+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,
199
+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,
200
+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,
201
+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,
202
+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,
203
+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,
204
+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,
205
+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,
206
+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,
207
+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,
208
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
209
+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,
210
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
211
+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,
212
+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,
213
+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,
214
+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,
215
+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,
216
+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,
217
+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,
218
+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,
219
+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,
220
+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,
221
+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,
222
+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,
223
+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,
224
+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,
225
+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,
226
+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,
227
+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,
228
+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,
229
+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,
230
+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,
231
+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,
232
+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,
233
+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,
234
+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,
235
+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,
236
+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,
237
+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,
238
+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,
239
+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,
240
+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,
241
+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,
242
+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,
243
+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,
244
+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,
245
+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,
246
+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,
247
+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,
248
+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,
249
+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,
250
+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,
251
+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,
252
+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,
253
+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,
254
+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,
255
+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,
256
+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,
257
+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,
258
+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,
259
+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,
260
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
261
+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,
262
+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,
263
+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,
264
+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,
265
+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,
266
+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,
267
+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,
268
+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,
269
+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,
270
+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,
271
+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,
272
+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,
273
+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,
274
+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,
275
+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,
276
+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,
277
+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,
278
+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,
279
+)
280
+
281
+Koi8rModel = {
282
+  'charToOrderMap': KOI8R_CharToOrderMap,
283
+  'precedenceMatrix': RussianLangModel,
284
+  'mTypicalPositiveRatio': 0.976601,
285
+  'keepEnglishLetter': False,
286
+  'charsetName': "KOI8-R"
287
+}
288
+
289
+Win1251CyrillicModel = {
290
+  'charToOrderMap': win1251_CharToOrderMap,
291
+  'precedenceMatrix': RussianLangModel,
292
+  'mTypicalPositiveRatio': 0.976601,
293
+  'keepEnglishLetter': False,
294
+  'charsetName': "windows-1251"
295
+}
296
+
297
+Latin5CyrillicModel = {
298
+  'charToOrderMap': latin5_CharToOrderMap,
299
+  'precedenceMatrix': RussianLangModel,
300
+  'mTypicalPositiveRatio': 0.976601,
301
+  'keepEnglishLetter': False,
302
+  'charsetName': "ISO-8859-5"
303
+}
304
+
305
+MacCyrillicModel = {
306
+  'charToOrderMap': macCyrillic_CharToOrderMap,
307
+  'precedenceMatrix': RussianLangModel,
308
+  'mTypicalPositiveRatio': 0.976601,
309
+  'keepEnglishLetter': False,
310
+  'charsetName': "MacCyrillic"
311
+};
312
+
313
+Ibm866Model = {
314
+  'charToOrderMap': IBM866_CharToOrderMap,
315
+  'precedenceMatrix': RussianLangModel,
316
+  'mTypicalPositiveRatio': 0.976601,
317
+  'keepEnglishLetter': False,
318
+  'charsetName': "IBM866"
319
+}
320
+
321
+Ibm855Model = {
322
+  'charToOrderMap': IBM855_CharToOrderMap,
323
+  'precedenceMatrix': RussianLangModel,
324
+  'mTypicalPositiveRatio': 0.976601,
325
+  'keepEnglishLetter': False,
326
+  'charsetName': "IBM855"
327
+}
328
+
329
+# flake8: noqa

+ 225
- 0
Contents/Libraries/Shared/requests/packages/chardet/langgreekmodel.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+# 255: Control characters that usually does not exist in any text
29
+# 254: Carriage/Return
30
+# 253: symbol (punctuation) that does not belong to word
31
+# 252: 0 - 9
32
+
33
+# Character Mapping Table:
34
+Latin7_CharToOrderMap = (
35
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
36
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
37
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
38
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
39
+253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
40
+ 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
41
+253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
42
+ 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
43
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
44
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
45
+253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
46
+253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123,  # b0
47
+110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
48
+ 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
49
+124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
50
+  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
51
+)
52
+
53
+win1253_CharToOrderMap = (
54
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
55
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
56
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
57
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
58
+253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85,  # 40
59
+ 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253,  # 50
60
+253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55,  # 60
61
+ 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253,  # 70
62
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 80
63
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 90
64
+253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253,  # a0
65
+253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123,  # b0
66
+110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39,  # c0
67
+ 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15,  # d0
68
+124,  1, 29, 20, 21,  3, 32, 13, 25,  5, 11, 16, 10,  6, 30,  4,  # e0
69
+  9,  8, 14,  7,  2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253,  # f0
70
+)
71
+
72
+# Model Table:
73
+# total sequences: 100%
74
+# first 512 sequences: 98.2851%
75
+# first 1024 sequences:1.7001%
76
+# rest  sequences:     0.0359%
77
+# negative sequences:  0.0148%
78
+GreekLangModel = (
79
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
80
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
81
+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,
82
+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,
83
+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,
84
+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,
85
+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,
86
+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,
87
+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,
88
+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,
89
+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,
90
+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,
91
+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,
92
+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,
93
+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,
94
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
95
+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,
96
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
97
+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,
98
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
99
+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,
100
+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,
101
+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,
102
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
103
+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,
104
+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,
105
+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,
106
+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,
107
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
108
+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,
109
+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,
110
+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,
111
+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,
112
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
113
+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,
114
+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,
115
+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,
116
+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,
117
+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,
118
+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,
119
+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,
120
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
121
+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,
122
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
123
+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,
124
+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,
125
+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,
126
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
127
+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,
128
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
129
+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,
130
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
131
+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,
132
+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,
133
+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,
134
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
135
+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,
136
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
137
+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,
138
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
139
+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,
140
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
141
+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,
142
+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,
143
+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,
144
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
145
+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,
146
+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,
147
+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,
148
+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,
149
+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,
150
+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,
151
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
152
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
153
+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,
154
+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,
155
+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,
156
+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,
157
+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,
158
+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,
159
+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,
160
+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,
161
+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,
162
+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,
163
+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,
164
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
165
+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,
166
+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,
167
+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,
168
+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,
169
+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,
170
+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,
171
+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,
172
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
173
+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,
174
+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,
175
+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,
176
+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,
177
+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,
178
+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,
179
+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,
180
+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,
181
+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,
182
+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,
183
+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,
184
+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,
185
+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,
186
+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,
187
+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,
188
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
189
+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,
190
+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,
191
+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,
192
+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,
193
+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,
194
+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,
195
+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,
196
+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,
197
+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,
198
+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,
199
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
200
+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,
201
+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,
202
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
203
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
204
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
205
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
206
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
207
+)
208
+
209
+Latin7GreekModel = {
210
+  'charToOrderMap': Latin7_CharToOrderMap,
211
+  'precedenceMatrix': GreekLangModel,
212
+  'mTypicalPositiveRatio': 0.982851,
213
+  'keepEnglishLetter': False,
214
+  'charsetName': "ISO-8859-7"
215
+}
216
+
217
+Win1253GreekModel = {
218
+  'charToOrderMap': win1253_CharToOrderMap,
219
+  'precedenceMatrix': GreekLangModel,
220
+  'mTypicalPositiveRatio': 0.982851,
221
+  'keepEnglishLetter': False,
222
+  'charsetName': "windows-1253"
223
+}
224
+
225
+# flake8: noqa

+ 201
- 0
Contents/Libraries/Shared/requests/packages/chardet/langhebrewmodel.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Universal charset detector code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+#          Simon Montagu
6
+# Portions created by the Initial Developer are Copyright (C) 2005
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#   Shy Shalom - original C code
12
+#   Shoshannah Forbes - original C code (?)
13
+#
14
+# This library is free software; you can redistribute it and/or
15
+# modify it under the terms of the GNU Lesser General Public
16
+# License as published by the Free Software Foundation; either
17
+# version 2.1 of the License, or (at your option) any later version.
18
+#
19
+# This library is distributed in the hope that it will be useful,
20
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
21
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22
+# Lesser General Public License for more details.
23
+#
24
+# You should have received a copy of the GNU Lesser General Public
25
+# License along with this library; if not, write to the Free Software
26
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
27
+# 02110-1301  USA
28
+######################### END LICENSE BLOCK #########################
29
+
30
+# 255: Control characters that usually does not exist in any text
31
+# 254: Carriage/Return
32
+# 253: symbol (punctuation) that does not belong to word
33
+# 252: 0 - 9
34
+
35
+# Windows-1255 language model
36
+# Character Mapping Table:
37
+win1255_CharToOrderMap = (
38
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
39
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
40
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
41
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
42
+253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85,  # 40
43
+ 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253,  # 50
44
+253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49,  # 60
45
+ 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253,  # 70
46
+124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214,
47
+215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221,
48
+ 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227,
49
+106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234,
50
+ 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237,
51
+238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250,
52
+  9,  8, 20, 16,  3,  2, 24, 14, 22,  1, 25, 15,  4, 11,  6, 23,
53
+ 12, 19, 13, 26, 18, 27, 21, 17,  7, 10,  5,251,252,128, 96,253,
54
+)
55
+
56
+# Model Table:
57
+# total sequences: 100%
58
+# first 512 sequences: 98.4004%
59
+# first 1024 sequences: 1.5981%
60
+# rest  sequences:      0.087%
61
+# negative sequences:   0.0015%
62
+HebrewLangModel = (
63
+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,
64
+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,
65
+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,
66
+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,
67
+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,
68
+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,
69
+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,
70
+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,
71
+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,
72
+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,
73
+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,
74
+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,
75
+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,
76
+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,
77
+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,
78
+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,
79
+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,
80
+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,
81
+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,
82
+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,
83
+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,
84
+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,
85
+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,
86
+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,
87
+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,
88
+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,
89
+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,
90
+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,
91
+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,
92
+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,
93
+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,
94
+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,
95
+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,
96
+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,
97
+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,
98
+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,
99
+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,
100
+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,
101
+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,
102
+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,
103
+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,
104
+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,
105
+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,
106
+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,
107
+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,
108
+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,
109
+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,
110
+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,
111
+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,
112
+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,
113
+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,
114
+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,
115
+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,
116
+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,
117
+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,
118
+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,
119
+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,
120
+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,
121
+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,
122
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
123
+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,
124
+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,
125
+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,
126
+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,
127
+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,
128
+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,
129
+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,
130
+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,
131
+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,
132
+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,
133
+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,
134
+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,
135
+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,
136
+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,
137
+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,
138
+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,
139
+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,
140
+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,
141
+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,
142
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
143
+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,
144
+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,
145
+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,
146
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
147
+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,
148
+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,
149
+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,
150
+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,
151
+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,
152
+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,
153
+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,
154
+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,
155
+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,
156
+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,
157
+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,
158
+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,
159
+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,
160
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
161
+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,
162
+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,
163
+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,
164
+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,
165
+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,
166
+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,
167
+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,
168
+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,
169
+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,
170
+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,
171
+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,
172
+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,
173
+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,
174
+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,
175
+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,
176
+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,
177
+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,
178
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
179
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
180
+0,0,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,
181
+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,
182
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
183
+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,
184
+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,
185
+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,
186
+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,
187
+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,
188
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
189
+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,
190
+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,
191
+)
192
+
193
+Win1255HebrewModel = {
194
+  'charToOrderMap': win1255_CharToOrderMap,
195
+  'precedenceMatrix': HebrewLangModel,
196
+  'mTypicalPositiveRatio': 0.984004,
197
+  'keepEnglishLetter': False,
198
+  'charsetName': "windows-1255"
199
+}
200
+
201
+# flake8: noqa

+ 225
- 0
Contents/Libraries/Shared/requests/packages/chardet/langhungarianmodel.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+# 255: Control characters that usually does not exist in any text
29
+# 254: Carriage/Return
30
+# 253: symbol (punctuation) that does not belong to word
31
+# 252: 0 - 9
32
+
33
+# Character Mapping Table:
34
+Latin2_HungarianCharToOrderMap = (
35
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
36
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
37
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
38
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
39
+253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
40
+ 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
41
+253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
42
+ 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
43
+159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,
44
+175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,
45
+191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205,
46
+ 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
47
+221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231,
48
+232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241,
49
+ 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85,
50
+245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253,
51
+)
52
+
53
+win1250HungarianCharToOrderMap = (
54
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
55
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
56
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
57
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
58
+253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47,
59
+ 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253,
60
+253,  2, 18, 26, 17,  1, 27, 12, 20,  9, 22,  7,  6, 13,  4,  8,
61
+ 23, 67, 10,  5,  3, 21, 19, 65, 62, 16, 11,253,253,253,253,253,
62
+161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,
63
+177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190,
64
+191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205,
65
+ 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
66
+221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231,
67
+232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241,
68
+ 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87,
69
+245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253,
70
+)
71
+
72
+# Model Table:
73
+# total sequences: 100%
74
+# first 512 sequences: 94.7368%
75
+# first 1024 sequences:5.2623%
76
+# rest  sequences:     0.8894%
77
+# negative sequences:  0.0009%
78
+HungarianLangModel = (
79
+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,
80
+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,
81
+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,
82
+0,0,0,0,0,0,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,
83
+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,
84
+0,0,0,0,0,0,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,
85
+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,
86
+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,
87
+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,
88
+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,
89
+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,
90
+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,
91
+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,
92
+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,
93
+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,
94
+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,
95
+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,
96
+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,
97
+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,
98
+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,
99
+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,
100
+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,
101
+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,
102
+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,
103
+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,
104
+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,
105
+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,
106
+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,
107
+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,
108
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
109
+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,
110
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
111
+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,
112
+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,
113
+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,
114
+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,
115
+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,
116
+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,
117
+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,
118
+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,
119
+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,
120
+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,
121
+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,
122
+0,0,0,0,0,0,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,
123
+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,
124
+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,
125
+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,
126
+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,
127
+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,
128
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
129
+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,
130
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
131
+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,
132
+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,
133
+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,
134
+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,
135
+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,
136
+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,
137
+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,
138
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
139
+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,
140
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
141
+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,
142
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
143
+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,
144
+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,
145
+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,
146
+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,
147
+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,
148
+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,
149
+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,
150
+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,
151
+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,
152
+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,
153
+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,
154
+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,
155
+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,
156
+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,
157
+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,
158
+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,
159
+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,
160
+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,
161
+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,
162
+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,
163
+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,
164
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
165
+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,
166
+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,
167
+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,
168
+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,
169
+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,
170
+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,
171
+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,
172
+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,
173
+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,
174
+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,
175
+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,
176
+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,
177
+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,
178
+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,
179
+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,
180
+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,
181
+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,
182
+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,
183
+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,
184
+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,
185
+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,
186
+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,
187
+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,
188
+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,
189
+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,
190
+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,
191
+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,
192
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
193
+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,
194
+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,
195
+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,
196
+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,
197
+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,
198
+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,
199
+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,
200
+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,
201
+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,
202
+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,
203
+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,
204
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
205
+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,
206
+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,
207
+)
208
+
209
+Latin2HungarianModel = {
210
+  'charToOrderMap': Latin2_HungarianCharToOrderMap,
211
+  'precedenceMatrix': HungarianLangModel,
212
+  'mTypicalPositiveRatio': 0.947368,
213
+  'keepEnglishLetter': True,
214
+  'charsetName': "ISO-8859-2"
215
+}
216
+
217
+Win1250HungarianModel = {
218
+  'charToOrderMap': win1250HungarianCharToOrderMap,
219
+  'precedenceMatrix': HungarianLangModel,
220
+  'mTypicalPositiveRatio': 0.947368,
221
+  'keepEnglishLetter': True,
222
+  'charsetName': "windows-1250"
223
+}
224
+
225
+# flake8: noqa

+ 200
- 0
Contents/Libraries/Shared/requests/packages/chardet/langthaimodel.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Communicator client code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+# 255: Control characters that usually does not exist in any text
29
+# 254: Carriage/Return
30
+# 253: symbol (punctuation) that does not belong to word
31
+# 252: 0 - 9
32
+
33
+# The following result for thai was collected from a limited sample (1M).
34
+
35
+# Character Mapping Table:
36
+TIS620CharToOrderMap = (
37
+255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255,  # 00
38
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  # 10
39
+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,  # 20
40
+252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,  # 30
41
+253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111,  # 40
42
+188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253,  # 50
43
+253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82,  # 60
44
+ 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253,  # 70
45
+209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222,
46
+223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235,
47
+236,  5, 30,237, 24,238, 75,  8, 26, 52, 34, 51,119, 47, 58, 57,
48
+ 49, 53, 55, 43, 20, 19, 44, 14, 48,  3, 17, 25, 39, 62, 31, 54,
49
+ 45,  9, 16,  2, 61, 15,239, 12, 42, 46, 18, 21, 76,  4, 66, 63,
50
+ 22, 10,  1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244,
51
+ 11, 28, 41, 29, 33,245, 50, 37,  6,  7, 67, 77, 38, 93,246,247,
52
+ 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253,
53
+)
54
+
55
+# Model Table:
56
+# total sequences: 100%
57
+# first 512 sequences: 92.6386%
58
+# first 1024 sequences:7.3177%
59
+# rest  sequences:     1.0230%
60
+# negative sequences:  0.0436%
61
+ThaiLangModel = (
62
+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,
63
+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,
64
+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,
65
+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,
66
+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,
67
+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,
68
+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,
69
+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,
70
+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,
71
+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,
72
+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,
73
+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,
74
+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,
75
+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,
76
+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,
77
+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,
78
+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,
79
+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,
80
+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,
81
+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,
82
+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,
83
+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,
84
+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,
85
+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,
86
+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,
87
+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,
88
+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,
89
+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,
90
+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,
91
+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,
92
+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,
93
+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,
94
+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,
95
+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,
96
+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,
97
+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,
98
+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,
99
+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,
100
+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,
101
+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,
102
+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,
103
+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,
104
+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,
105
+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,
106
+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,
107
+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,
108
+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,
109
+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,
110
+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,
111
+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,
112
+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,
113
+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,
114
+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,
115
+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,
116
+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,
117
+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,
118
+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,
119
+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,
120
+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,
121
+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,
122
+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,
123
+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,
124
+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,
125
+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,
126
+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,
127
+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,
128
+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,
129
+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,
130
+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,
131
+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,
132
+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,
133
+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,
134
+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,
135
+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,
136
+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,
137
+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,
138
+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,
139
+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,
140
+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,
141
+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,
142
+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,
143
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
144
+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,
145
+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,
146
+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,
147
+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,
148
+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,
149
+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,
150
+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,
151
+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,
152
+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,
153
+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,
154
+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,
155
+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,
156
+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,
157
+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,
158
+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,
159
+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,
160
+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,
161
+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,
162
+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,
163
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
164
+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,
165
+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,
166
+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,
167
+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,
168
+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,
169
+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,
170
+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,
171
+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,
172
+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,
173
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
174
+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,
175
+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,
176
+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,
177
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
178
+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,
179
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
180
+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,
181
+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,
182
+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,
183
+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,
184
+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,
185
+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,
186
+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,
187
+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,
188
+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,
189
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
190
+)
191
+
192
+TIS620ThaiModel = {
193
+  'charToOrderMap': TIS620CharToOrderMap,
194
+  'precedenceMatrix': ThaiLangModel,
195
+  'mTypicalPositiveRatio': 0.926386,
196
+  'keepEnglishLetter': False,
197
+  'charsetName': "TIS-620"
198
+}
199
+
200
+# flake8: noqa

+ 139
- 0
Contents/Libraries/Shared/requests/packages/chardet/latin1prober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Universal charset detector code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 2001
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#   Shy Shalom - original C code
12
+#
13
+# This library is free software; you can redistribute it and/or
14
+# modify it under the terms of the GNU Lesser General Public
15
+# License as published by the Free Software Foundation; either
16
+# version 2.1 of the License, or (at your option) any later version.
17
+#
18
+# This library is distributed in the hope that it will be useful,
19
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21
+# Lesser General Public License for more details.
22
+#
23
+# You should have received a copy of the GNU Lesser General Public
24
+# License along with this library; if not, write to the Free Software
25
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26
+# 02110-1301  USA
27
+######################### END LICENSE BLOCK #########################
28
+
29
+from .charsetprober import CharSetProber
30
+from .constants import eNotMe
31
+from .compat import wrap_ord
32
+
33
+FREQ_CAT_NUM = 4
34
+
35
+UDF = 0  # undefined
36
+OTH = 1  # other
37
+ASC = 2  # ascii capital letter
38
+ASS = 3  # ascii small letter
39
+ACV = 4  # accent capital vowel
40
+ACO = 5  # accent capital other
41
+ASV = 6  # accent small vowel
42
+ASO = 7  # accent small other
43
+CLASS_NUM = 8  # total classes
44
+
45
+Latin1_CharToClass = (
46
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 00 - 07
47
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 08 - 0F
48
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 10 - 17
49
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 18 - 1F
50
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 20 - 27
51
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 28 - 2F
52
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 30 - 37
53
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 38 - 3F
54
+    OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 40 - 47
55
+    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 48 - 4F
56
+    ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC,   # 50 - 57
57
+    ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH,   # 58 - 5F
58
+    OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 60 - 67
59
+    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 68 - 6F
60
+    ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS,   # 70 - 77
61
+    ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH,   # 78 - 7F
62
+    OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH,   # 80 - 87
63
+    OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF,   # 88 - 8F
64
+    UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # 90 - 97
65
+    OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO,   # 98 - 9F
66
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A0 - A7
67
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # A8 - AF
68
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B0 - B7
69
+    OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH,   # B8 - BF
70
+    ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO,   # C0 - C7
71
+    ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV,   # C8 - CF
72
+    ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH,   # D0 - D7
73
+    ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO,   # D8 - DF
74
+    ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO,   # E0 - E7
75
+    ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV,   # E8 - EF
76
+    ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH,   # F0 - F7
77
+    ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO,   # F8 - FF
78
+)
79
+
80
+# 0 : illegal
81
+# 1 : very unlikely
82
+# 2 : normal
83
+# 3 : very likely
84
+Latin1ClassModel = (
85
+    # UDF OTH ASC ASS ACV ACO ASV ASO
86
+    0,  0,  0,  0,  0,  0,  0,  0,  # UDF
87
+    0,  3,  3,  3,  3,  3,  3,  3,  # OTH
88
+    0,  3,  3,  3,  3,  3,  3,  3,  # ASC
89
+    0,  3,  3,  3,  1,  1,  3,  3,  # ASS
90
+    0,  3,  3,  3,  1,  2,  1,  2,  # ACV
91
+    0,  3,  3,  3,  3,  3,  3,  3,  # ACO
92
+    0,  3,  1,  3,  1,  1,  1,  3,  # ASV
93
+    0,  3,  1,  3,  1,  1,  3,  3,  # ASO
94
+)
95
+
96
+
97
+class Latin1Prober(CharSetProber):
98
+    def __init__(self):
99
+        CharSetProber.__init__(self)
100
+        self.reset()
101
+
102
+    def reset(self):
103
+        self._mLastCharClass = OTH
104
+        self._mFreqCounter = [0] * FREQ_CAT_NUM
105
+        CharSetProber.reset(self)
106
+
107
+    def get_charset_name(self):
108
+        return "windows-1252"
109
+
110
+    def feed(self, aBuf):
111
+        aBuf = self.filter_with_english_letters(aBuf)
112
+        for c in aBuf:
113
+            charClass = Latin1_CharToClass[wrap_ord(c)]
114
+            freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM)
115
+                                    + charClass]
116
+            if freq == 0:
117
+                self._mState = eNotMe
118
+                break
119
+            self._mFreqCounter[freq] += 1
120
+            self._mLastCharClass = charClass
121
+
122
+        return self.get_state()
123
+
124
+    def get_confidence(self):
125
+        if self.get_state() == eNotMe:
126
+            return 0.01
127
+
128
+        total = sum(self._mFreqCounter)
129
+        if total < 0.01:
130
+            confidence = 0.0
131
+        else:
132
+            confidence = ((self._mFreqCounter[3] - self._mFreqCounter[1] * 20.0)
133
+                          / total)
134
+        if confidence < 0.0:
135
+            confidence = 0.0
136
+        # lower the confidence of latin1 so that other more accurate
137
+        # detector can take priority.
138
+        confidence = confidence * 0.73
139
+        return confidence

+ 86
- 0
Contents/Libraries/Shared/requests/packages/chardet/mbcharsetprober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Universal charset detector code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 2001
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#   Shy Shalom - original C code
12
+#   Proofpoint, Inc.
13
+#
14
+# This library is free software; you can redistribute it and/or
15
+# modify it under the terms of the GNU Lesser General Public
16
+# License as published by the Free Software Foundation; either
17
+# version 2.1 of the License, or (at your option) any later version.
18
+#
19
+# This library is distributed in the hope that it will be useful,
20
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
21
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22
+# Lesser General Public License for more details.
23
+#
24
+# You should have received a copy of the GNU Lesser General Public
25
+# License along with this library; if not, write to the Free Software
26
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
27
+# 02110-1301  USA
28
+######################### END LICENSE BLOCK #########################
29
+
30
+import sys
31
+from . import constants
32
+from .charsetprober import CharSetProber
33
+
34
+
35
+class MultiByteCharSetProber(CharSetProber):
36
+    def __init__(self):
37
+        CharSetProber.__init__(self)
38
+        self._mDistributionAnalyzer = None
39
+        self._mCodingSM = None
40
+        self._mLastChar = [0, 0]
41
+
42
+    def reset(self):
43
+        CharSetProber.reset(self)
44
+        if self._mCodingSM:
45
+            self._mCodingSM.reset()
46
+        if self._mDistributionAnalyzer:
47
+            self._mDistributionAnalyzer.reset()
48
+        self._mLastChar = [0, 0]
49
+
50
+    def get_charset_name(self):
51
+        pass
52
+
53
+    def feed(self, aBuf):
54
+        aLen = len(aBuf)
55
+        for i in range(0, aLen):
56
+            codingState = self._mCodingSM.next_state(aBuf[i])
57
+            if codingState == constants.eError:
58
+                if constants._debug:
59
+                    sys.stderr.write(self.get_charset_name()
60
+                                     + ' prober hit error at byte ' + str(i)
61
+                                     + '\n')
62
+                self._mState = constants.eNotMe
63
+                break
64
+            elif codingState == constants.eItsMe:
65
+                self._mState = constants.eFoundIt
66
+                break
67
+            elif codingState == constants.eStart:
68
+                charLen = self._mCodingSM.get_current_charlen()
69
+                if i == 0:
70
+                    self._mLastChar[1] = aBuf[0]
71
+                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
72
+                else:
73
+                    self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],
74
+                                                     charLen)
75
+
76
+        self._mLastChar[0] = aBuf[aLen - 1]
77
+
78
+        if self.get_state() == constants.eDetecting:
79
+            if (self._mDistributionAnalyzer.got_enough_data() and
80
+                    (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):
81
+                self._mState = constants.eFoundIt
82
+
83
+        return self.get_state()
84
+
85
+    def get_confidence(self):
86
+        return self._mDistributionAnalyzer.get_confidence()

+ 54
- 0
Contents/Libraries/Shared/requests/packages/chardet/mbcsgroupprober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Universal charset detector code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 2001
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#   Shy Shalom - original C code
12
+#   Proofpoint, Inc.
13
+#
14
+# This library is free software; you can redistribute it and/or
15
+# modify it under the terms of the GNU Lesser General Public
16
+# License as published by the Free Software Foundation; either
17
+# version 2.1 of the License, or (at your option) any later version.
18
+#
19
+# This library is distributed in the hope that it will be useful,
20
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
21
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22
+# Lesser General Public License for more details.
23
+#
24
+# You should have received a copy of the GNU Lesser General Public
25
+# License along with this library; if not, write to the Free Software
26
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
27
+# 02110-1301  USA
28
+######################### END LICENSE BLOCK #########################
29
+
30
+from .charsetgroupprober import CharSetGroupProber
31
+from .utf8prober import UTF8Prober
32
+from .sjisprober import SJISProber
33
+from .eucjpprober import EUCJPProber
34
+from .gb2312prober import GB2312Prober
35
+from .euckrprober import EUCKRProber
36
+from .cp949prober import CP949Prober
37
+from .big5prober import Big5Prober
38
+from .euctwprober import EUCTWProber
39
+
40
+
41
+class MBCSGroupProber(CharSetGroupProber):
42
+    def __init__(self):
43
+        CharSetGroupProber.__init__(self)
44
+        self._mProbers = [
45
+            UTF8Prober(),
46
+            SJISProber(),
47
+            EUCJPProber(),
48
+            GB2312Prober(),
49
+            EUCKRProber(),
50
+            CP949Prober(),
51
+            Big5Prober(),
52
+            EUCTWProber()
53
+        ]
54
+        self.reset()

+ 572
- 0
Contents/Libraries/Shared/requests/packages/chardet/mbcssm.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is mozilla.org code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from .constants import eStart, eError, eItsMe
29
+
30
+# BIG5
31
+
32
+BIG5_cls = (
33
+    1,1,1,1,1,1,1,1,  # 00 - 07    #allow 0x00 as legal value
34
+    1,1,1,1,1,1,0,0,  # 08 - 0f
35
+    1,1,1,1,1,1,1,1,  # 10 - 17
36
+    1,1,1,0,1,1,1,1,  # 18 - 1f
37
+    1,1,1,1,1,1,1,1,  # 20 - 27
38
+    1,1,1,1,1,1,1,1,  # 28 - 2f
39
+    1,1,1,1,1,1,1,1,  # 30 - 37
40
+    1,1,1,1,1,1,1,1,  # 38 - 3f
41
+    2,2,2,2,2,2,2,2,  # 40 - 47
42
+    2,2,2,2,2,2,2,2,  # 48 - 4f
43
+    2,2,2,2,2,2,2,2,  # 50 - 57
44
+    2,2,2,2,2,2,2,2,  # 58 - 5f
45
+    2,2,2,2,2,2,2,2,  # 60 - 67
46
+    2,2,2,2,2,2,2,2,  # 68 - 6f
47
+    2,2,2,2,2,2,2,2,  # 70 - 77
48
+    2,2,2,2,2,2,2,1,  # 78 - 7f
49
+    4,4,4,4,4,4,4,4,  # 80 - 87
50
+    4,4,4,4,4,4,4,4,  # 88 - 8f
51
+    4,4,4,4,4,4,4,4,  # 90 - 97
52
+    4,4,4,4,4,4,4,4,  # 98 - 9f
53
+    4,3,3,3,3,3,3,3,  # a0 - a7
54
+    3,3,3,3,3,3,3,3,  # a8 - af
55
+    3,3,3,3,3,3,3,3,  # b0 - b7
56
+    3,3,3,3,3,3,3,3,  # b8 - bf
57
+    3,3,3,3,3,3,3,3,  # c0 - c7
58
+    3,3,3,3,3,3,3,3,  # c8 - cf
59
+    3,3,3,3,3,3,3,3,  # d0 - d7
60
+    3,3,3,3,3,3,3,3,  # d8 - df
61
+    3,3,3,3,3,3,3,3,  # e0 - e7
62
+    3,3,3,3,3,3,3,3,  # e8 - ef
63
+    3,3,3,3,3,3,3,3,  # f0 - f7
64
+    3,3,3,3,3,3,3,0  # f8 - ff
65
+)
66
+
67
+BIG5_st = (
68
+    eError,eStart,eStart,     3,eError,eError,eError,eError,#00-07
69
+    eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f
70
+    eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17
71
+)
72
+
73
+Big5CharLenTable = (0, 1, 1, 2, 0)
74
+
75
+Big5SMModel = {'classTable': BIG5_cls,
76
+               'classFactor': 5,
77
+               'stateTable': BIG5_st,
78
+               'charLenTable': Big5CharLenTable,
79
+               'name': 'Big5'}
80
+
81
+# CP949
82
+
83
+CP949_cls  = (
84
+    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,  # 00 - 0f
85
+    1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,  # 10 - 1f
86
+    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 20 - 2f
87
+    1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,  # 30 - 3f
88
+    1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,  # 40 - 4f
89
+    4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 50 - 5f
90
+    1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,  # 60 - 6f
91
+    5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1,  # 70 - 7f
92
+    0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 80 - 8f
93
+    6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,  # 90 - 9f
94
+    6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8,  # a0 - af
95
+    7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,  # b0 - bf
96
+    7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2,  # c0 - cf
97
+    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # d0 - df
98
+    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,  # e0 - ef
99
+    2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0,  # f0 - ff
100
+)
101
+
102
+CP949_st = (
103
+#cls=    0      1      2      3      4      5      6      7      8      9  # previous state =
104
+    eError,eStart,     3,eError,eStart,eStart,     4,     5,eError,     6, # eStart
105
+    eError,eError,eError,eError,eError,eError,eError,eError,eError,eError, # eError
106
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe, # eItsMe
107
+    eError,eError,eStart,eStart,eError,eError,eError,eStart,eStart,eStart, # 3
108
+    eError,eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 4
109
+    eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 5
110
+    eError,eStart,eStart,eStart,eStart,eError,eError,eStart,eStart,eStart, # 6
111
+)
112
+
113
+CP949CharLenTable = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2)
114
+
115
+CP949SMModel = {'classTable': CP949_cls,
116
+                'classFactor': 10,
117
+                'stateTable': CP949_st,
118
+                'charLenTable': CP949CharLenTable,
119
+                'name': 'CP949'}
120
+
121
+# EUC-JP
122
+
123
+EUCJP_cls = (
124
+    4,4,4,4,4,4,4,4,  # 00 - 07
125
+    4,4,4,4,4,4,5,5,  # 08 - 0f
126
+    4,4,4,4,4,4,4,4,  # 10 - 17
127
+    4,4,4,5,4,4,4,4,  # 18 - 1f
128
+    4,4,4,4,4,4,4,4,  # 20 - 27
129
+    4,4,4,4,4,4,4,4,  # 28 - 2f
130
+    4,4,4,4,4,4,4,4,  # 30 - 37
131
+    4,4,4,4,4,4,4,4,  # 38 - 3f
132
+    4,4,4,4,4,4,4,4,  # 40 - 47
133
+    4,4,4,4,4,4,4,4,  # 48 - 4f
134
+    4,4,4,4,4,4,4,4,  # 50 - 57
135
+    4,4,4,4,4,4,4,4,  # 58 - 5f
136
+    4,4,4,4,4,4,4,4,  # 60 - 67
137
+    4,4,4,4,4,4,4,4,  # 68 - 6f
138
+    4,4,4,4,4,4,4,4,  # 70 - 77
139
+    4,4,4,4,4,4,4,4,  # 78 - 7f
140
+    5,5,5,5,5,5,5,5,  # 80 - 87
141
+    5,5,5,5,5,5,1,3,  # 88 - 8f
142
+    5,5,5,5,5,5,5,5,  # 90 - 97
143
+    5,5,5,5,5,5,5,5,  # 98 - 9f
144
+    5,2,2,2,2,2,2,2,  # a0 - a7
145
+    2,2,2,2,2,2,2,2,  # a8 - af
146
+    2,2,2,2,2,2,2,2,  # b0 - b7
147
+    2,2,2,2,2,2,2,2,  # b8 - bf
148
+    2,2,2,2,2,2,2,2,  # c0 - c7
149
+    2,2,2,2,2,2,2,2,  # c8 - cf
150
+    2,2,2,2,2,2,2,2,  # d0 - d7
151
+    2,2,2,2,2,2,2,2,  # d8 - df
152
+    0,0,0,0,0,0,0,0,  # e0 - e7
153
+    0,0,0,0,0,0,0,0,  # e8 - ef
154
+    0,0,0,0,0,0,0,0,  # f0 - f7
155
+    0,0,0,0,0,0,0,5  # f8 - ff
156
+)
157
+
158
+EUCJP_st = (
159
+          3,     4,     3,     5,eStart,eError,eError,eError,#00-07
160
+     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f
161
+     eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17
162
+     eError,eError,eStart,eError,eError,eError,     3,eError,#18-1f
163
+          3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27
164
+)
165
+
166
+EUCJPCharLenTable = (2, 2, 2, 3, 1, 0)
167
+
168
+EUCJPSMModel = {'classTable': EUCJP_cls,
169
+                'classFactor': 6,
170
+                'stateTable': EUCJP_st,
171
+                'charLenTable': EUCJPCharLenTable,
172
+                'name': 'EUC-JP'}
173
+
174
+# EUC-KR
175
+
176
+EUCKR_cls  = (
177
+    1,1,1,1,1,1,1,1,  # 00 - 07
178
+    1,1,1,1,1,1,0,0,  # 08 - 0f
179
+    1,1,1,1,1,1,1,1,  # 10 - 17
180
+    1,1,1,0,1,1,1,1,  # 18 - 1f
181
+    1,1,1,1,1,1,1,1,  # 20 - 27
182
+    1,1,1,1,1,1,1,1,  # 28 - 2f
183
+    1,1,1,1,1,1,1,1,  # 30 - 37
184
+    1,1,1,1,1,1,1,1,  # 38 - 3f
185
+    1,1,1,1,1,1,1,1,  # 40 - 47
186
+    1,1,1,1,1,1,1,1,  # 48 - 4f
187
+    1,1,1,1,1,1,1,1,  # 50 - 57
188
+    1,1,1,1,1,1,1,1,  # 58 - 5f
189
+    1,1,1,1,1,1,1,1,  # 60 - 67
190
+    1,1,1,1,1,1,1,1,  # 68 - 6f
191
+    1,1,1,1,1,1,1,1,  # 70 - 77
192
+    1,1,1,1,1,1,1,1,  # 78 - 7f
193
+    0,0,0,0,0,0,0,0,  # 80 - 87
194
+    0,0,0,0,0,0,0,0,  # 88 - 8f
195
+    0,0,0,0,0,0,0,0,  # 90 - 97
196
+    0,0,0,0,0,0,0,0,  # 98 - 9f
197
+    0,2,2,2,2,2,2,2,  # a0 - a7
198
+    2,2,2,2,2,3,3,3,  # a8 - af
199
+    2,2,2,2,2,2,2,2,  # b0 - b7
200
+    2,2,2,2,2,2,2,2,  # b8 - bf
201
+    2,2,2,2,2,2,2,2,  # c0 - c7
202
+    2,3,2,2,2,2,2,2,  # c8 - cf
203
+    2,2,2,2,2,2,2,2,  # d0 - d7
204
+    2,2,2,2,2,2,2,2,  # d8 - df
205
+    2,2,2,2,2,2,2,2,  # e0 - e7
206
+    2,2,2,2,2,2,2,2,  # e8 - ef
207
+    2,2,2,2,2,2,2,2,  # f0 - f7
208
+    2,2,2,2,2,2,2,0   # f8 - ff
209
+)
210
+
211
+EUCKR_st = (
212
+    eError,eStart,     3,eError,eError,eError,eError,eError,#00-07
213
+    eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f
214
+)
215
+
216
+EUCKRCharLenTable = (0, 1, 2, 0)
217
+
218
+EUCKRSMModel = {'classTable': EUCKR_cls,
219
+                'classFactor': 4,
220
+                'stateTable': EUCKR_st,
221
+                'charLenTable': EUCKRCharLenTable,
222
+                'name': 'EUC-KR'}
223
+
224
+# EUC-TW
225
+
226
+EUCTW_cls = (
227
+    2,2,2,2,2,2,2,2,  # 00 - 07
228
+    2,2,2,2,2,2,0,0,  # 08 - 0f
229
+    2,2,2,2,2,2,2,2,  # 10 - 17
230
+    2,2,2,0,2,2,2,2,  # 18 - 1f
231
+    2,2,2,2,2,2,2,2,  # 20 - 27
232
+    2,2,2,2,2,2,2,2,  # 28 - 2f
233
+    2,2,2,2,2,2,2,2,  # 30 - 37
234
+    2,2,2,2,2,2,2,2,  # 38 - 3f
235
+    2,2,2,2,2,2,2,2,  # 40 - 47
236
+    2,2,2,2,2,2,2,2,  # 48 - 4f
237
+    2,2,2,2,2,2,2,2,  # 50 - 57
238
+    2,2,2,2,2,2,2,2,  # 58 - 5f
239
+    2,2,2,2,2,2,2,2,  # 60 - 67
240
+    2,2,2,2,2,2,2,2,  # 68 - 6f
241
+    2,2,2,2,2,2,2,2,  # 70 - 77
242
+    2,2,2,2,2,2,2,2,  # 78 - 7f
243
+    0,0,0,0,0,0,0,0,  # 80 - 87
244
+    0,0,0,0,0,0,6,0,  # 88 - 8f
245
+    0,0,0,0,0,0,0,0,  # 90 - 97
246
+    0,0,0,0,0,0,0,0,  # 98 - 9f
247
+    0,3,4,4,4,4,4,4,  # a0 - a7
248
+    5,5,1,1,1,1,1,1,  # a8 - af
249
+    1,1,1,1,1,1,1,1,  # b0 - b7
250
+    1,1,1,1,1,1,1,1,  # b8 - bf
251
+    1,1,3,1,3,3,3,3,  # c0 - c7
252
+    3,3,3,3,3,3,3,3,  # c8 - cf
253
+    3,3,3,3,3,3,3,3,  # d0 - d7
254
+    3,3,3,3,3,3,3,3,  # d8 - df
255
+    3,3,3,3,3,3,3,3,  # e0 - e7
256
+    3,3,3,3,3,3,3,3,  # e8 - ef
257
+    3,3,3,3,3,3,3,3,  # f0 - f7
258
+    3,3,3,3,3,3,3,0   # f8 - ff
259
+)
260
+
261
+EUCTW_st = (
262
+    eError,eError,eStart,     3,     3,     3,     4,eError,#00-07
263
+    eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f
264
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17
265
+    eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f
266
+         5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27
267
+    eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f
268
+)
269
+
270
+EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3)
271
+
272
+EUCTWSMModel = {'classTable': EUCTW_cls,
273
+                'classFactor': 7,
274
+                'stateTable': EUCTW_st,
275
+                'charLenTable': EUCTWCharLenTable,
276
+                'name': 'x-euc-tw'}
277
+
278
+# GB2312
279
+
280
+GB2312_cls = (
281
+    1,1,1,1,1,1,1,1,  # 00 - 07
282
+    1,1,1,1,1,1,0,0,  # 08 - 0f
283
+    1,1,1,1,1,1,1,1,  # 10 - 17
284
+    1,1,1,0,1,1,1,1,  # 18 - 1f
285
+    1,1,1,1,1,1,1,1,  # 20 - 27
286
+    1,1,1,1,1,1,1,1,  # 28 - 2f
287
+    3,3,3,3,3,3,3,3,  # 30 - 37
288
+    3,3,1,1,1,1,1,1,  # 38 - 3f
289
+    2,2,2,2,2,2,2,2,  # 40 - 47
290
+    2,2,2,2,2,2,2,2,  # 48 - 4f
291
+    2,2,2,2,2,2,2,2,  # 50 - 57
292
+    2,2,2,2,2,2,2,2,  # 58 - 5f
293
+    2,2,2,2,2,2,2,2,  # 60 - 67
294
+    2,2,2,2,2,2,2,2,  # 68 - 6f
295
+    2,2,2,2,2,2,2,2,  # 70 - 77
296
+    2,2,2,2,2,2,2,4,  # 78 - 7f
297
+    5,6,6,6,6,6,6,6,  # 80 - 87
298
+    6,6,6,6,6,6,6,6,  # 88 - 8f
299
+    6,6,6,6,6,6,6,6,  # 90 - 97
300
+    6,6,6,6,6,6,6,6,  # 98 - 9f
301
+    6,6,6,6,6,6,6,6,  # a0 - a7
302
+    6,6,6,6,6,6,6,6,  # a8 - af
303
+    6,6,6,6,6,6,6,6,  # b0 - b7
304
+    6,6,6,6,6,6,6,6,  # b8 - bf
305
+    6,6,6,6,6,6,6,6,  # c0 - c7
306
+    6,6,6,6,6,6,6,6,  # c8 - cf
307
+    6,6,6,6,6,6,6,6,  # d0 - d7
308
+    6,6,6,6,6,6,6,6,  # d8 - df
309
+    6,6,6,6,6,6,6,6,  # e0 - e7
310
+    6,6,6,6,6,6,6,6,  # e8 - ef
311
+    6,6,6,6,6,6,6,6,  # f0 - f7
312
+    6,6,6,6,6,6,6,0   # f8 - ff
313
+)
314
+
315
+GB2312_st = (
316
+    eError,eStart,eStart,eStart,eStart,eStart,     3,eError,#00-07
317
+    eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f
318
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17
319
+         4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f
320
+    eError,eError,     5,eError,eError,eError,eItsMe,eError,#20-27
321
+    eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f
322
+)
323
+
324
+# To be accurate, the length of class 6 can be either 2 or 4.
325
+# But it is not necessary to discriminate between the two since
326
+# it is used for frequency analysis only, and we are validing
327
+# each code range there as well. So it is safe to set it to be
328
+# 2 here.
329
+GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2)
330
+
331
+GB2312SMModel = {'classTable': GB2312_cls,
332
+                  'classFactor': 7,
333
+                  'stateTable': GB2312_st,
334
+                  'charLenTable': GB2312CharLenTable,
335
+                  'name': 'GB2312'}
336
+
337
+# Shift_JIS
338
+
339
+SJIS_cls = (
340
+    1,1,1,1,1,1,1,1,  # 00 - 07
341
+    1,1,1,1,1,1,0,0,  # 08 - 0f
342
+    1,1,1,1,1,1,1,1,  # 10 - 17
343
+    1,1,1,0,1,1,1,1,  # 18 - 1f
344
+    1,1,1,1,1,1,1,1,  # 20 - 27
345
+    1,1,1,1,1,1,1,1,  # 28 - 2f
346
+    1,1,1,1,1,1,1,1,  # 30 - 37
347
+    1,1,1,1,1,1,1,1,  # 38 - 3f
348
+    2,2,2,2,2,2,2,2,  # 40 - 47
349
+    2,2,2,2,2,2,2,2,  # 48 - 4f
350
+    2,2,2,2,2,2,2,2,  # 50 - 57
351
+    2,2,2,2,2,2,2,2,  # 58 - 5f
352
+    2,2,2,2,2,2,2,2,  # 60 - 67
353
+    2,2,2,2,2,2,2,2,  # 68 - 6f
354
+    2,2,2,2,2,2,2,2,  # 70 - 77
355
+    2,2,2,2,2,2,2,1,  # 78 - 7f
356
+    3,3,3,3,3,2,2,3,  # 80 - 87
357
+    3,3,3,3,3,3,3,3,  # 88 - 8f
358
+    3,3,3,3,3,3,3,3,  # 90 - 97
359
+    3,3,3,3,3,3,3,3,  # 98 - 9f
360
+    #0xa0 is illegal in sjis encoding, but some pages does
361
+    #contain such byte. We need to be more error forgiven.
362
+    2,2,2,2,2,2,2,2,  # a0 - a7
363
+    2,2,2,2,2,2,2,2,  # a8 - af
364
+    2,2,2,2,2,2,2,2,  # b0 - b7
365
+    2,2,2,2,2,2,2,2,  # b8 - bf
366
+    2,2,2,2,2,2,2,2,  # c0 - c7
367
+    2,2,2,2,2,2,2,2,  # c8 - cf
368
+    2,2,2,2,2,2,2,2,  # d0 - d7
369
+    2,2,2,2,2,2,2,2,  # d8 - df
370
+    3,3,3,3,3,3,3,3,  # e0 - e7
371
+    3,3,3,3,3,4,4,4,  # e8 - ef
372
+    3,3,3,3,3,3,3,3,  # f0 - f7
373
+    3,3,3,3,3,0,0,0)  # f8 - ff
374
+
375
+
376
+SJIS_st = (
377
+    eError,eStart,eStart,     3,eError,eError,eError,eError,#00-07
378
+    eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f
379
+    eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17
380
+)
381
+
382
+SJISCharLenTable = (0, 1, 1, 2, 0, 0)
383
+
384
+SJISSMModel = {'classTable': SJIS_cls,
385
+               'classFactor': 6,
386
+               'stateTable': SJIS_st,
387
+               'charLenTable': SJISCharLenTable,
388
+               'name': 'Shift_JIS'}
389
+
390
+# UCS2-BE
391
+
392
+UCS2BE_cls = (
393
+    0,0,0,0,0,0,0,0,  # 00 - 07
394
+    0,0,1,0,0,2,0,0,  # 08 - 0f
395
+    0,0,0,0,0,0,0,0,  # 10 - 17
396
+    0,0,0,3,0,0,0,0,  # 18 - 1f
397
+    0,0,0,0,0,0,0,0,  # 20 - 27
398
+    0,3,3,3,3,3,0,0,  # 28 - 2f
399
+    0,0,0,0,0,0,0,0,  # 30 - 37
400
+    0,0,0,0,0,0,0,0,  # 38 - 3f
401
+    0,0,0,0,0,0,0,0,  # 40 - 47
402
+    0,0,0,0,0,0,0,0,  # 48 - 4f
403
+    0,0,0,0,0,0,0,0,  # 50 - 57
404
+    0,0,0,0,0,0,0,0,  # 58 - 5f
405
+    0,0,0,0,0,0,0,0,  # 60 - 67
406
+    0,0,0,0,0,0,0,0,  # 68 - 6f
407
+    0,0,0,0,0,0,0,0,  # 70 - 77
408
+    0,0,0,0,0,0,0,0,  # 78 - 7f
409
+    0,0,0,0,0,0,0,0,  # 80 - 87
410
+    0,0,0,0,0,0,0,0,  # 88 - 8f
411
+    0,0,0,0,0,0,0,0,  # 90 - 97
412
+    0,0,0,0,0,0,0,0,  # 98 - 9f
413
+    0,0,0,0,0,0,0,0,  # a0 - a7
414
+    0,0,0,0,0,0,0,0,  # a8 - af
415
+    0,0,0,0,0,0,0,0,  # b0 - b7
416
+    0,0,0,0,0,0,0,0,  # b8 - bf
417
+    0,0,0,0,0,0,0,0,  # c0 - c7
418
+    0,0,0,0,0,0,0,0,  # c8 - cf
419
+    0,0,0,0,0,0,0,0,  # d0 - d7
420
+    0,0,0,0,0,0,0,0,  # d8 - df
421
+    0,0,0,0,0,0,0,0,  # e0 - e7
422
+    0,0,0,0,0,0,0,0,  # e8 - ef
423
+    0,0,0,0,0,0,0,0,  # f0 - f7
424
+    0,0,0,0,0,0,4,5   # f8 - ff
425
+)
426
+
427
+UCS2BE_st  = (
428
+          5,     7,     7,eError,     4,     3,eError,eError,#00-07
429
+     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f
430
+     eItsMe,eItsMe,     6,     6,     6,     6,eError,eError,#10-17
431
+          6,     6,     6,     6,     6,eItsMe,     6,     6,#18-1f
432
+          6,     6,     6,     6,     5,     7,     7,eError,#20-27
433
+          5,     8,     6,     6,eError,     6,     6,     6,#28-2f
434
+          6,     6,     6,     6,eError,eError,eStart,eStart #30-37
435
+)
436
+
437
+UCS2BECharLenTable = (2, 2, 2, 0, 2, 2)
438
+
439
+UCS2BESMModel = {'classTable': UCS2BE_cls,
440
+                 'classFactor': 6,
441
+                 'stateTable': UCS2BE_st,
442
+                 'charLenTable': UCS2BECharLenTable,
443
+                 'name': 'UTF-16BE'}
444
+
445
+# UCS2-LE
446
+
447
+UCS2LE_cls = (
448
+    0,0,0,0,0,0,0,0,  # 00 - 07
449
+    0,0,1,0,0,2,0,0,  # 08 - 0f
450
+    0,0,0,0,0,0,0,0,  # 10 - 17
451
+    0,0,0,3,0,0,0,0,  # 18 - 1f
452
+    0,0,0,0,0,0,0,0,  # 20 - 27
453
+    0,3,3,3,3,3,0,0,  # 28 - 2f
454
+    0,0,0,0,0,0,0,0,  # 30 - 37
455
+    0,0,0,0,0,0,0,0,  # 38 - 3f
456
+    0,0,0,0,0,0,0,0,  # 40 - 47
457
+    0,0,0,0,0,0,0,0,  # 48 - 4f
458
+    0,0,0,0,0,0,0,0,  # 50 - 57
459
+    0,0,0,0,0,0,0,0,  # 58 - 5f
460
+    0,0,0,0,0,0,0,0,  # 60 - 67
461
+    0,0,0,0,0,0,0,0,  # 68 - 6f
462
+    0,0,0,0,0,0,0,0,  # 70 - 77
463
+    0,0,0,0,0,0,0,0,  # 78 - 7f
464
+    0,0,0,0,0,0,0,0,  # 80 - 87
465
+    0,0,0,0,0,0,0,0,  # 88 - 8f
466
+    0,0,0,0,0,0,0,0,  # 90 - 97
467
+    0,0,0,0,0,0,0,0,  # 98 - 9f
468
+    0,0,0,0,0,0,0,0,  # a0 - a7
469
+    0,0,0,0,0,0,0,0,  # a8 - af
470
+    0,0,0,0,0,0,0,0,  # b0 - b7
471
+    0,0,0,0,0,0,0,0,  # b8 - bf
472
+    0,0,0,0,0,0,0,0,  # c0 - c7
473
+    0,0,0,0,0,0,0,0,  # c8 - cf
474
+    0,0,0,0,0,0,0,0,  # d0 - d7
475
+    0,0,0,0,0,0,0,0,  # d8 - df
476
+    0,0,0,0,0,0,0,0,  # e0 - e7
477
+    0,0,0,0,0,0,0,0,  # e8 - ef
478
+    0,0,0,0,0,0,0,0,  # f0 - f7
479
+    0,0,0,0,0,0,4,5   # f8 - ff
480
+)
481
+
482
+UCS2LE_st = (
483
+          6,     6,     7,     6,     4,     3,eError,eError,#00-07
484
+     eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f
485
+     eItsMe,eItsMe,     5,     5,     5,eError,eItsMe,eError,#10-17
486
+          5,     5,     5,eError,     5,eError,     6,     6,#18-1f
487
+          7,     6,     8,     8,     5,     5,     5,eError,#20-27
488
+          5,     5,     5,eError,eError,eError,     5,     5,#28-2f
489
+          5,     5,     5,eError,     5,eError,eStart,eStart #30-37
490
+)
491
+
492
+UCS2LECharLenTable = (2, 2, 2, 2, 2, 2)
493
+
494
+UCS2LESMModel = {'classTable': UCS2LE_cls,
495
+                 'classFactor': 6,
496
+                 'stateTable': UCS2LE_st,
497
+                 'charLenTable': UCS2LECharLenTable,
498
+                 'name': 'UTF-16LE'}
499
+
500
+# UTF-8
501
+
502
+UTF8_cls = (
503
+    1,1,1,1,1,1,1,1,  # 00 - 07  #allow 0x00 as a legal value
504
+    1,1,1,1,1,1,0,0,  # 08 - 0f
505
+    1,1,1,1,1,1,1,1,  # 10 - 17
506
+    1,1,1,0,1,1,1,1,  # 18 - 1f
507
+    1,1,1,1,1,1,1,1,  # 20 - 27
508
+    1,1,1,1,1,1,1,1,  # 28 - 2f
509
+    1,1,1,1,1,1,1,1,  # 30 - 37
510
+    1,1,1,1,1,1,1,1,  # 38 - 3f
511
+    1,1,1,1,1,1,1,1,  # 40 - 47
512
+    1,1,1,1,1,1,1,1,  # 48 - 4f
513
+    1,1,1,1,1,1,1,1,  # 50 - 57
514
+    1,1,1,1,1,1,1,1,  # 58 - 5f
515
+    1,1,1,1,1,1,1,1,  # 60 - 67
516
+    1,1,1,1,1,1,1,1,  # 68 - 6f
517
+    1,1,1,1,1,1,1,1,  # 70 - 77
518
+    1,1,1,1,1,1,1,1,  # 78 - 7f
519
+    2,2,2,2,3,3,3,3,  # 80 - 87
520
+    4,4,4,4,4,4,4,4,  # 88 - 8f
521
+    4,4,4,4,4,4,4,4,  # 90 - 97
522
+    4,4,4,4,4,4,4,4,  # 98 - 9f
523
+    5,5,5,5,5,5,5,5,  # a0 - a7
524
+    5,5,5,5,5,5,5,5,  # a8 - af
525
+    5,5,5,5,5,5,5,5,  # b0 - b7
526
+    5,5,5,5,5,5,5,5,  # b8 - bf
527
+    0,0,6,6,6,6,6,6,  # c0 - c7
528
+    6,6,6,6,6,6,6,6,  # c8 - cf
529
+    6,6,6,6,6,6,6,6,  # d0 - d7
530
+    6,6,6,6,6,6,6,6,  # d8 - df
531
+    7,8,8,8,8,8,8,8,  # e0 - e7
532
+    8,8,8,8,8,9,8,8,  # e8 - ef
533
+    10,11,11,11,11,11,11,11,  # f0 - f7
534
+    12,13,13,13,14,15,0,0    # f8 - ff
535
+)
536
+
537
+UTF8_st = (
538
+    eError,eStart,eError,eError,eError,eError,     12,   10,#00-07
539
+         9,     11,     8,     7,     6,     5,     4,    3,#08-0f
540
+    eError,eError,eError,eError,eError,eError,eError,eError,#10-17
541
+    eError,eError,eError,eError,eError,eError,eError,eError,#18-1f
542
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27
543
+    eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f
544
+    eError,eError,     5,     5,     5,     5,eError,eError,#30-37
545
+    eError,eError,eError,eError,eError,eError,eError,eError,#38-3f
546
+    eError,eError,eError,     5,     5,     5,eError,eError,#40-47
547
+    eError,eError,eError,eError,eError,eError,eError,eError,#48-4f
548
+    eError,eError,     7,     7,     7,     7,eError,eError,#50-57
549
+    eError,eError,eError,eError,eError,eError,eError,eError,#58-5f
550
+    eError,eError,eError,eError,     7,     7,eError,eError,#60-67
551
+    eError,eError,eError,eError,eError,eError,eError,eError,#68-6f
552
+    eError,eError,     9,     9,     9,     9,eError,eError,#70-77
553
+    eError,eError,eError,eError,eError,eError,eError,eError,#78-7f
554
+    eError,eError,eError,eError,eError,     9,eError,eError,#80-87
555
+    eError,eError,eError,eError,eError,eError,eError,eError,#88-8f
556
+    eError,eError,    12,    12,    12,    12,eError,eError,#90-97
557
+    eError,eError,eError,eError,eError,eError,eError,eError,#98-9f
558
+    eError,eError,eError,eError,eError,    12,eError,eError,#a0-a7
559
+    eError,eError,eError,eError,eError,eError,eError,eError,#a8-af
560
+    eError,eError,    12,    12,    12,eError,eError,eError,#b0-b7
561
+    eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf
562
+    eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7
563
+    eError,eError,eError,eError,eError,eError,eError,eError #c8-cf
564
+)
565
+
566
+UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6)
567
+
568
+UTF8SMModel = {'classTable': UTF8_cls,
569
+               'classFactor': 16,
570
+               'stateTable': UTF8_st,
571
+               'charLenTable': UTF8CharLenTable,
572
+               'name': 'UTF-8'}

+ 120
- 0
Contents/Libraries/Shared/requests/packages/chardet/sbcharsetprober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Universal charset detector code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 2001
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#   Shy Shalom - original C code
12
+#
13
+# This library is free software; you can redistribute it and/or
14
+# modify it under the terms of the GNU Lesser General Public
15
+# License as published by the Free Software Foundation; either
16
+# version 2.1 of the License, or (at your option) any later version.
17
+#
18
+# This library is distributed in the hope that it will be useful,
19
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21
+# Lesser General Public License for more details.
22
+#
23
+# You should have received a copy of the GNU Lesser General Public
24
+# License along with this library; if not, write to the Free Software
25
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26
+# 02110-1301  USA
27
+######################### END LICENSE BLOCK #########################
28
+
29
+import sys
30
+from . import constants
31
+from .charsetprober import CharSetProber
32
+from .compat import wrap_ord
33
+
34
+SAMPLE_SIZE = 64
35
+SB_ENOUGH_REL_THRESHOLD = 1024
36
+POSITIVE_SHORTCUT_THRESHOLD = 0.95
37
+NEGATIVE_SHORTCUT_THRESHOLD = 0.05
38
+SYMBOL_CAT_ORDER = 250
39
+NUMBER_OF_SEQ_CAT = 4
40
+POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1
41
+#NEGATIVE_CAT = 0
42
+
43
+
44
+class SingleByteCharSetProber(CharSetProber):
45
+    def __init__(self, model, reversed=False, nameProber=None):
46
+        CharSetProber.__init__(self)
47
+        self._mModel = model
48
+        # TRUE if we need to reverse every pair in the model lookup
49
+        self._mReversed = reversed
50
+        # Optional auxiliary prober for name decision
51
+        self._mNameProber = nameProber
52
+        self.reset()
53
+
54
+    def reset(self):
55
+        CharSetProber.reset(self)
56
+        # char order of last character
57
+        self._mLastOrder = 255
58
+        self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT
59
+        self._mTotalSeqs = 0
60
+        self._mTotalChar = 0
61
+        # characters that fall in our sampling range
62
+        self._mFreqChar = 0
63
+
64
+    def get_charset_name(self):
65
+        if self._mNameProber:
66
+            return self._mNameProber.get_charset_name()
67
+        else:
68
+            return self._mModel['charsetName']
69
+
70
+    def feed(self, aBuf):
71
+        if not self._mModel['keepEnglishLetter']:
72
+            aBuf = self.filter_without_english_letters(aBuf)
73
+        aLen = len(aBuf)
74
+        if not aLen:
75
+            return self.get_state()
76
+        for c in aBuf:
77
+            order = self._mModel['charToOrderMap'][wrap_ord(c)]
78
+            if order < SYMBOL_CAT_ORDER:
79
+                self._mTotalChar += 1
80
+            if order < SAMPLE_SIZE:
81
+                self._mFreqChar += 1
82
+                if self._mLastOrder < SAMPLE_SIZE:
83
+                    self._mTotalSeqs += 1
84
+                    if not self._mReversed:
85
+                        i = (self._mLastOrder * SAMPLE_SIZE) + order
86
+                        model = self._mModel['precedenceMatrix'][i]
87
+                    else:  # reverse the order of the letters in the lookup
88
+                        i = (order * SAMPLE_SIZE) + self._mLastOrder
89
+                        model = self._mModel['precedenceMatrix'][i]
90
+                    self._mSeqCounters[model] += 1
91
+            self._mLastOrder = order
92
+
93
+        if self.get_state() == constants.eDetecting:
94
+            if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD:
95
+                cf = self.get_confidence()
96
+                if cf > POSITIVE_SHORTCUT_THRESHOLD:
97
+                    if constants._debug:
98
+                        sys.stderr.write('%s confidence = %s, we have a'
99
+                                         'winner\n' %
100
+                                         (self._mModel['charsetName'], cf))
101
+                    self._mState = constants.eFoundIt
102
+                elif cf < NEGATIVE_SHORTCUT_THRESHOLD:
103
+                    if constants._debug:
104
+                        sys.stderr.write('%s confidence = %s, below negative'
105
+                                         'shortcut threshhold %s\n' %
106
+                                         (self._mModel['charsetName'], cf,
107
+                                          NEGATIVE_SHORTCUT_THRESHOLD))
108
+                    self._mState = constants.eNotMe
109
+
110
+        return self.get_state()
111
+
112
+    def get_confidence(self):
113
+        r = 0.01
114
+        if self._mTotalSeqs > 0:
115
+            r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs
116
+                 / self._mModel['mTypicalPositiveRatio'])
117
+            r = r * self._mFreqChar / self._mTotalChar
118
+            if r >= 1.0:
119
+                r = 0.99
120
+        return r

+ 69
- 0
Contents/Libraries/Shared/requests/packages/chardet/sbcsgroupprober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Universal charset detector code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 2001
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#   Shy Shalom - original C code
12
+#
13
+# This library is free software; you can redistribute it and/or
14
+# modify it under the terms of the GNU Lesser General Public
15
+# License as published by the Free Software Foundation; either
16
+# version 2.1 of the License, or (at your option) any later version.
17
+#
18
+# This library is distributed in the hope that it will be useful,
19
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21
+# Lesser General Public License for more details.
22
+#
23
+# You should have received a copy of the GNU Lesser General Public
24
+# License along with this library; if not, write to the Free Software
25
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26
+# 02110-1301  USA
27
+######################### END LICENSE BLOCK #########################
28
+
29
+from .charsetgroupprober import CharSetGroupProber
30
+from .sbcharsetprober import SingleByteCharSetProber
31
+from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel,
32
+                                Latin5CyrillicModel, MacCyrillicModel,
33
+                                Ibm866Model, Ibm855Model)
34
+from .langgreekmodel import Latin7GreekModel, Win1253GreekModel
35
+from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel
36
+from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel
37
+from .langthaimodel import TIS620ThaiModel
38
+from .langhebrewmodel import Win1255HebrewModel
39
+from .hebrewprober import HebrewProber
40
+
41
+
42
+class SBCSGroupProber(CharSetGroupProber):
43
+    def __init__(self):
44
+        CharSetGroupProber.__init__(self)
45
+        self._mProbers = [
46
+            SingleByteCharSetProber(Win1251CyrillicModel),
47
+            SingleByteCharSetProber(Koi8rModel),
48
+            SingleByteCharSetProber(Latin5CyrillicModel),
49
+            SingleByteCharSetProber(MacCyrillicModel),
50
+            SingleByteCharSetProber(Ibm866Model),
51
+            SingleByteCharSetProber(Ibm855Model),
52
+            SingleByteCharSetProber(Latin7GreekModel),
53
+            SingleByteCharSetProber(Win1253GreekModel),
54
+            SingleByteCharSetProber(Latin5BulgarianModel),
55
+            SingleByteCharSetProber(Win1251BulgarianModel),
56
+            SingleByteCharSetProber(Latin2HungarianModel),
57
+            SingleByteCharSetProber(Win1250HungarianModel),
58
+            SingleByteCharSetProber(TIS620ThaiModel),
59
+        ]
60
+        hebrewProber = HebrewProber()
61
+        logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel,
62
+                                                      False, hebrewProber)
63
+        visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True,
64
+                                                     hebrewProber)
65
+        hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber)
66
+        self._mProbers.extend([hebrewProber, logicalHebrewProber,
67
+                               visualHebrewProber])
68
+
69
+        self.reset()

+ 91
- 0
Contents/Libraries/Shared/requests/packages/chardet/sjisprober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is mozilla.org code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+import sys
29
+from .mbcharsetprober import MultiByteCharSetProber
30
+from .codingstatemachine import CodingStateMachine
31
+from .chardistribution import SJISDistributionAnalysis
32
+from .jpcntx import SJISContextAnalysis
33
+from .mbcssm import SJISSMModel
34
+from . import constants
35
+
36
+
37
+class SJISProber(MultiByteCharSetProber):
38
+    def __init__(self):
39
+        MultiByteCharSetProber.__init__(self)
40
+        self._mCodingSM = CodingStateMachine(SJISSMModel)
41
+        self._mDistributionAnalyzer = SJISDistributionAnalysis()
42
+        self._mContextAnalyzer = SJISContextAnalysis()
43
+        self.reset()
44
+
45
+    def reset(self):
46
+        MultiByteCharSetProber.reset(self)
47
+        self._mContextAnalyzer.reset()
48
+
49
+    def get_charset_name(self):
50
+        return self._mContextAnalyzer.get_charset_name()
51
+
52
+    def feed(self, aBuf):
53
+        aLen = len(aBuf)
54
+        for i in range(0, aLen):
55
+            codingState = self._mCodingSM.next_state(aBuf[i])
56
+            if codingState == constants.eError:
57
+                if constants._debug:
58
+                    sys.stderr.write(self.get_charset_name()
59
+                                     + ' prober hit error at byte ' + str(i)
60
+                                     + '\n')
61
+                self._mState = constants.eNotMe
62
+                break
63
+            elif codingState == constants.eItsMe:
64
+                self._mState = constants.eFoundIt
65
+                break
66
+            elif codingState == constants.eStart:
67
+                charLen = self._mCodingSM.get_current_charlen()
68
+                if i == 0:
69
+                    self._mLastChar[1] = aBuf[0]
70
+                    self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:],
71
+                                                charLen)
72
+                    self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
73
+                else:
74
+                    self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3
75
+                                                     - charLen], charLen)
76
+                    self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],
77
+                                                     charLen)
78
+
79
+        self._mLastChar[0] = aBuf[aLen - 1]
80
+
81
+        if self.get_state() == constants.eDetecting:
82
+            if (self._mContextAnalyzer.got_enough_data() and
83
+               (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):
84
+                self._mState = constants.eFoundIt
85
+
86
+        return self.get_state()
87
+
88
+    def get_confidence(self):
89
+        contxtCf = self._mContextAnalyzer.get_confidence()
90
+        distribCf = self._mDistributionAnalyzer.get_confidence()
91
+        return max(contxtCf, distribCf)

+ 170
- 0
Contents/Libraries/Shared/requests/packages/chardet/universaldetector.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is Mozilla Universal charset detector code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 2001
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#   Shy Shalom - original C code
12
+#
13
+# This library is free software; you can redistribute it and/or
14
+# modify it under the terms of the GNU Lesser General Public
15
+# License as published by the Free Software Foundation; either
16
+# version 2.1 of the License, or (at your option) any later version.
17
+#
18
+# This library is distributed in the hope that it will be useful,
19
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21
+# Lesser General Public License for more details.
22
+#
23
+# You should have received a copy of the GNU Lesser General Public
24
+# License along with this library; if not, write to the Free Software
25
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26
+# 02110-1301  USA
27
+######################### END LICENSE BLOCK #########################
28
+
29
+from . import constants
30
+import sys
31
+import codecs
32
+from .latin1prober import Latin1Prober  # windows-1252
33
+from .mbcsgroupprober import MBCSGroupProber  # multi-byte character sets
34
+from .sbcsgroupprober import SBCSGroupProber  # single-byte character sets
35
+from .escprober import EscCharSetProber  # ISO-2122, etc.
36
+import re
37
+
38
+MINIMUM_THRESHOLD = 0.20
39
+ePureAscii = 0
40
+eEscAscii = 1
41
+eHighbyte = 2
42
+
43
+
44
+class UniversalDetector:
45
+    def __init__(self):
46
+        self._highBitDetector = re.compile(b'[\x80-\xFF]')
47
+        self._escDetector = re.compile(b'(\033|~{)')
48
+        self._mEscCharSetProber = None
49
+        self._mCharSetProbers = []
50
+        self.reset()
51
+
52
+    def reset(self):
53
+        self.result = {'encoding': None, 'confidence': 0.0}
54
+        self.done = False
55
+        self._mStart = True
56
+        self._mGotData = False
57
+        self._mInputState = ePureAscii
58
+        self._mLastChar = b''
59
+        if self._mEscCharSetProber:
60
+            self._mEscCharSetProber.reset()
61
+        for prober in self._mCharSetProbers:
62
+            prober.reset()
63
+
64
+    def feed(self, aBuf):
65
+        if self.done:
66
+            return
67
+
68
+        aLen = len(aBuf)
69
+        if not aLen:
70
+            return
71
+
72
+        if not self._mGotData:
73
+            # If the data starts with BOM, we know it is UTF
74
+            if aBuf[:3] == codecs.BOM_UTF8:
75
+                # EF BB BF  UTF-8 with BOM
76
+                self.result = {'encoding': "UTF-8-SIG", 'confidence': 1.0}
77
+            elif aBuf[:4] == codecs.BOM_UTF32_LE:
78
+                # FF FE 00 00  UTF-32, little-endian BOM
79
+                self.result = {'encoding': "UTF-32LE", 'confidence': 1.0}
80
+            elif aBuf[:4] == codecs.BOM_UTF32_BE:
81
+                # 00 00 FE FF  UTF-32, big-endian BOM
82
+                self.result = {'encoding': "UTF-32BE", 'confidence': 1.0}
83
+            elif aBuf[:4] == b'\xFE\xFF\x00\x00':
84
+                # FE FF 00 00  UCS-4, unusual octet order BOM (3412)
85
+                self.result = {
86
+                    'encoding': "X-ISO-10646-UCS-4-3412",
87
+                    'confidence': 1.0
88
+                }
89
+            elif aBuf[:4] == b'\x00\x00\xFF\xFE':
90
+                # 00 00 FF FE  UCS-4, unusual octet order BOM (2143)
91
+                self.result = {
92
+                    'encoding': "X-ISO-10646-UCS-4-2143",
93
+                    'confidence': 1.0
94
+                }
95
+            elif aBuf[:2] == codecs.BOM_LE:
96
+                # FF FE  UTF-16, little endian BOM
97
+                self.result = {'encoding': "UTF-16LE", 'confidence': 1.0}
98
+            elif aBuf[:2] == codecs.BOM_BE:
99
+                # FE FF  UTF-16, big endian BOM
100
+                self.result = {'encoding': "UTF-16BE", 'confidence': 1.0}
101
+
102
+        self._mGotData = True
103
+        if self.result['encoding'] and (self.result['confidence'] > 0.0):
104
+            self.done = True
105
+            return
106
+
107
+        if self._mInputState == ePureAscii:
108
+            if self._highBitDetector.search(aBuf):
109
+                self._mInputState = eHighbyte
110
+            elif ((self._mInputState == ePureAscii) and
111
+                    self._escDetector.search(self._mLastChar + aBuf)):
112
+                self._mInputState = eEscAscii
113
+
114
+        self._mLastChar = aBuf[-1:]
115
+
116
+        if self._mInputState == eEscAscii:
117
+            if not self._mEscCharSetProber:
118
+                self._mEscCharSetProber = EscCharSetProber()
119
+            if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt:
120
+                self.result = {'encoding': self._mEscCharSetProber.get_charset_name(),
121
+                               'confidence': self._mEscCharSetProber.get_confidence()}
122
+                self.done = True
123
+        elif self._mInputState == eHighbyte:
124
+            if not self._mCharSetProbers:
125
+                self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(),
126
+                                         Latin1Prober()]
127
+            for prober in self._mCharSetProbers:
128
+                if prober.feed(aBuf) == constants.eFoundIt:
129
+                    self.result = {'encoding': prober.get_charset_name(),
130
+                                   'confidence': prober.get_confidence()}
131
+                    self.done = True
132
+                    break
133
+
134
+    def close(self):
135
+        if self.done:
136
+            return
137
+        if not self._mGotData:
138
+            if constants._debug:
139
+                sys.stderr.write('no data received!\n')
140
+            return
141
+        self.done = True
142
+
143
+        if self._mInputState == ePureAscii:
144
+            self.result = {'encoding': 'ascii', 'confidence': 1.0}
145
+            return self.result
146
+
147
+        if self._mInputState == eHighbyte:
148
+            proberConfidence = None
149
+            maxProberConfidence = 0.0
150
+            maxProber = None
151
+            for prober in self._mCharSetProbers:
152
+                if not prober:
153
+                    continue
154
+                proberConfidence = prober.get_confidence()
155
+                if proberConfidence > maxProberConfidence:
156
+                    maxProberConfidence = proberConfidence
157
+                    maxProber = prober
158
+            if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD):
159
+                self.result = {'encoding': maxProber.get_charset_name(),
160
+                               'confidence': maxProber.get_confidence()}
161
+                return self.result
162
+
163
+        if constants._debug:
164
+            sys.stderr.write('no probers hit minimum threshhold\n')
165
+            for prober in self._mCharSetProbers[0].mProbers:
166
+                if not prober:
167
+                    continue
168
+                sys.stderr.write('%s confidence = %s\n' %
169
+                                 (prober.get_charset_name(),
170
+                                  prober.get_confidence()))

+ 76
- 0
Contents/Libraries/Shared/requests/packages/chardet/utf8prober.py View File

1
+######################## BEGIN LICENSE BLOCK ########################
2
+# The Original Code is mozilla.org code.
3
+#
4
+# The Initial Developer of the Original Code is
5
+# Netscape Communications Corporation.
6
+# Portions created by the Initial Developer are Copyright (C) 1998
7
+# the Initial Developer. All Rights Reserved.
8
+#
9
+# Contributor(s):
10
+#   Mark Pilgrim - port to Python
11
+#
12
+# This library is free software; you can redistribute it and/or
13
+# modify it under the terms of the GNU Lesser General Public
14
+# License as published by the Free Software Foundation; either
15
+# version 2.1 of the License, or (at your option) any later version.
16
+#
17
+# This library is distributed in the hope that it will be useful,
18
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
+# Lesser General Public License for more details.
21
+#
22
+# You should have received a copy of the GNU Lesser General Public
23
+# License along with this library; if not, write to the Free Software
24
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25
+# 02110-1301  USA
26
+######################### END LICENSE BLOCK #########################
27
+
28
+from . import constants
29
+from .charsetprober import CharSetProber
30
+from .codingstatemachine import CodingStateMachine
31
+from .mbcssm import UTF8SMModel
32
+
33
+ONE_CHAR_PROB = 0.5
34
+
35
+
36
+class UTF8Prober(CharSetProber):
37
+    def __init__(self):
38
+        CharSetProber.__init__(self)
39
+        self._mCodingSM = CodingStateMachine(UTF8SMModel)
40
+        self.reset()
41
+
42
+    def reset(self):
43
+        CharSetProber.reset(self)
44
+        self._mCodingSM.reset()
45
+        self._mNumOfMBChar = 0
46
+
47
+    def get_charset_name(self):
48
+        return "utf-8"
49
+
50
+    def feed(self, aBuf):
51
+        for c in aBuf:
52
+            codingState = self._mCodingSM.next_state(c)
53
+            if codingState == constants.eError:
54
+                self._mState = constants.eNotMe
55
+                break
56
+            elif codingState == constants.eItsMe:
57
+                self._mState = constants.eFoundIt
58
+                break
59
+            elif codingState == constants.eStart:
60
+                if self._mCodingSM.get_current_charlen() >= 2:
61
+                    self._mNumOfMBChar += 1
62
+
63
+        if self.get_state() == constants.eDetecting:
64
+            if self.get_confidence() > constants.SHORTCUT_THRESHOLD:
65
+                self._mState = constants.eFoundIt
66
+
67
+        return self.get_state()
68
+
69
+    def get_confidence(self):
70
+        unlike = 0.99
71
+        if self._mNumOfMBChar < 6:
72
+            for i in range(0, self._mNumOfMBChar):
73
+                unlike = unlike * ONE_CHAR_PROB
74
+            return 1.0 - unlike
75
+        else:
76
+            return unlike

+ 1
- 0
Contents/Libraries/Shared/requests/packages/idna/__init__.py View File

1
+from .core import *

+ 118
- 0
Contents/Libraries/Shared/requests/packages/idna/codec.py View File

1
+from .core import encode, decode, alabel, ulabel, IDNAError
2
+import codecs
3
+import re
4
+
5
+_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
6
+
7
+class Codec(codecs.Codec):
8
+
9
+    def encode(self, data, errors='strict'):
10
+
11
+        if errors != 'strict':
12
+            raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
13
+
14
+        if not data:
15
+            return "", 0
16
+
17
+        return encode(data), len(data)
18
+
19
+    def decode(self, data, errors='strict'):
20
+
21
+        if errors != 'strict':
22
+            raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
23
+
24
+        if not data:
25
+            return u"", 0
26
+
27
+        return decode(data), len(data)
28
+
29
+class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
30
+    def _buffer_encode(self, data, errors, final):
31
+        if errors != 'strict':
32
+            raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
33
+
34
+        if not data:
35
+            return ("", 0)
36
+
37
+        labels = _unicode_dots_re.split(data)
38
+        trailing_dot = u''
39
+        if labels:
40
+            if not labels[-1]:
41
+                trailing_dot = '.'
42
+                del labels[-1]
43
+            elif not final:
44
+                # Keep potentially unfinished label until the next call
45
+                del labels[-1]
46
+                if labels:
47
+                    trailing_dot = '.'
48
+
49
+        result = []
50
+        size = 0
51
+        for label in labels:
52
+            result.append(alabel(label))
53
+            if size:
54
+                size += 1
55
+            size += len(label)
56
+
57
+        # Join with U+002E
58
+        result = ".".join(result) + trailing_dot
59
+        size += len(trailing_dot)
60
+        return (result, size)
61
+
62
+class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
63
+    def _buffer_decode(self, data, errors, final):
64
+        if errors != 'strict':
65
+            raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
66
+
67
+        if not data:
68
+            return (u"", 0)
69
+
70
+        # IDNA allows decoding to operate on Unicode strings, too.
71
+        if isinstance(data, unicode):
72
+            labels = _unicode_dots_re.split(data)
73
+        else:
74
+            # Must be ASCII string
75
+            data = str(data)
76
+            unicode(data, "ascii")
77
+            labels = data.split(".")
78
+
79
+        trailing_dot = u''
80
+        if labels:
81
+            if not labels[-1]:
82
+                trailing_dot = u'.'
83
+                del labels[-1]
84
+            elif not final:
85
+                # Keep potentially unfinished label until the next call
86
+                del labels[-1]
87
+                if labels:
88
+                    trailing_dot = u'.'
89
+
90
+        result = []
91
+        size = 0
92
+        for label in labels:
93
+            result.append(ulabel(label))
94
+            if size:
95
+                size += 1
96
+            size += len(label)
97
+
98
+        result = u".".join(result) + trailing_dot
99
+        size += len(trailing_dot)
100
+        return (result, size)
101
+
102
+
103
+class StreamWriter(Codec, codecs.StreamWriter):
104
+    pass
105
+
106
+class StreamReader(Codec, codecs.StreamReader):
107
+    pass
108
+
109
+def getregentry():
110
+    return codecs.CodecInfo(
111
+        name='idna',
112
+        encode=Codec().encode,
113
+        decode=Codec().decode,
114
+        incrementalencoder=IncrementalEncoder,
115
+        incrementaldecoder=IncrementalDecoder,
116
+        streamwriter=StreamWriter,
117
+        streamreader=StreamReader,
118
+    )

+ 12
- 0
Contents/Libraries/Shared/requests/packages/idna/compat.py View File

1
+from .core import *
2
+from .codec import *
3
+
4
+def ToASCII(label):
5
+    return encode(label)
6
+
7
+def ToUnicode(label):
8
+    return decode(label)
9
+
10
+def nameprep(s):
11
+    raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol")
12
+

+ 387
- 0
Contents/Libraries/Shared/requests/packages/idna/core.py View File

1
+from . import idnadata
2
+import bisect
3
+import unicodedata
4
+import re
5
+import sys
6
+from .intranges import intranges_contain
7
+
8
+_virama_combining_class = 9
9
+_alabel_prefix = b'xn--'
10
+_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
11
+
12
+if sys.version_info[0] == 3:
13
+    unicode = str
14
+    unichr = chr
15
+
16
+class IDNAError(UnicodeError):
17
+    """ Base exception for all IDNA-encoding related problems """
18
+    pass
19
+
20
+
21
+class IDNABidiError(IDNAError):
22
+    """ Exception when bidirectional requirements are not satisfied """
23
+    pass
24
+
25
+
26
+class InvalidCodepoint(IDNAError):
27
+    """ Exception when a disallowed or unallocated codepoint is used """
28
+    pass
29
+
30
+
31
+class InvalidCodepointContext(IDNAError):
32
+    """ Exception when the codepoint is not valid in the context it is used """
33
+    pass
34
+
35
+
36
+def _combining_class(cp):
37
+    return unicodedata.combining(unichr(cp))
38
+
39
+def _is_script(cp, script):
40
+    return intranges_contain(ord(cp), idnadata.scripts[script])
41
+
42
+def _punycode(s):
43
+    return s.encode('punycode')
44
+
45
+def _unot(s):
46
+    return 'U+{0:04X}'.format(s)
47
+
48
+
49
+def valid_label_length(label):
50
+
51
+    if len(label) > 63:
52
+        return False
53
+    return True
54
+
55
+
56
+def valid_string_length(label, trailing_dot):
57
+
58
+    if len(label) > (254 if trailing_dot else 253):
59
+        return False
60
+    return True
61
+
62
+
63
+def check_bidi(label, check_ltr=False):
64
+
65
+    # Bidi rules should only be applied if string contains RTL characters
66
+    bidi_label = False
67
+    for (idx, cp) in enumerate(label, 1):
68
+        direction = unicodedata.bidirectional(cp)
69
+        if direction == '':
70
+            # String likely comes from a newer version of Unicode
71
+            raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx))
72
+        if direction in ['R', 'AL', 'AN']:
73
+            bidi_label = True
74
+            break
75
+    if not bidi_label and not check_ltr:
76
+        return True
77
+
78
+    # Bidi rule 1
79
+    direction = unicodedata.bidirectional(label[0])
80
+    if direction in ['R', 'AL']:
81
+        rtl = True
82
+    elif direction == 'L':
83
+        rtl = False
84
+    else:
85
+        raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label)))
86
+
87
+    valid_ending = False
88
+    number_type = False
89
+    for (idx, cp) in enumerate(label, 1):
90
+        direction = unicodedata.bidirectional(cp)
91
+
92
+        if rtl:
93
+            # Bidi rule 2
94
+            if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
95
+                raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx))
96
+            # Bidi rule 3
97
+            if direction in ['R', 'AL', 'EN', 'AN']:
98
+                valid_ending = True
99
+            elif direction != 'NSM':
100
+                valid_ending = False
101
+            # Bidi rule 4
102
+            if direction in ['AN', 'EN']:
103
+                if not number_type:
104
+                    number_type = direction
105
+                else:
106
+                    if number_type != direction:
107
+                        raise IDNABidiError('Can not mix numeral types in a right-to-left label')
108
+        else:
109
+            # Bidi rule 5
110
+            if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
111
+                raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx))
112
+            # Bidi rule 6
113
+            if direction in ['L', 'EN']:
114
+                valid_ending = True
115
+            elif direction != 'NSM':
116
+                valid_ending = False
117
+
118
+    if not valid_ending:
119
+        raise IDNABidiError('Label ends with illegal codepoint directionality')
120
+
121
+    return True
122
+
123
+
124
+def check_initial_combiner(label):
125
+
126
+    if unicodedata.category(label[0])[0] == 'M':
127
+        raise IDNAError('Label begins with an illegal combining character')
128
+    return True
129
+
130
+
131
+def check_hyphen_ok(label):
132
+
133
+    if label[2:4] == '--':
134
+        raise IDNAError('Label has disallowed hyphens in 3rd and 4th position')
135
+    if label[0] == '-' or label[-1] == '-':
136
+        raise IDNAError('Label must not start or end with a hyphen')
137
+    return True
138
+
139
+
140
+def check_nfc(label):
141
+
142
+    if unicodedata.normalize('NFC', label) != label:
143
+        raise IDNAError('Label must be in Normalization Form C')
144
+
145
+
146
+def valid_contextj(label, pos):
147
+
148
+    cp_value = ord(label[pos])
149
+
150
+    if cp_value == 0x200c:
151
+
152
+        if pos > 0:
153
+            if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
154
+                return True
155
+
156
+        ok = False
157
+        for i in range(pos-1, -1, -1):
158
+            joining_type = idnadata.joining_types.get(ord(label[i]))
159
+            if joining_type == 'T':
160
+                continue
161
+            if joining_type in ['L', 'D']:
162
+                ok = True
163
+                break
164
+
165
+        if not ok:
166
+            return False
167
+
168
+        ok = False
169
+        for i in range(pos+1, len(label)):
170
+            joining_type = idnadata.joining_types.get(ord(label[i]))
171
+            if joining_type == 'T':
172
+                continue
173
+            if joining_type in ['R', 'D']:
174
+                ok = True
175
+                break
176
+        return ok
177
+
178
+    if cp_value == 0x200d:
179
+
180
+        if pos > 0:
181
+            if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
182
+                return True
183
+        return False
184
+
185
+    else:
186
+
187
+        return False
188
+
189
+
190
+def valid_contexto(label, pos, exception=False):
191
+
192
+    cp_value = ord(label[pos])
193
+
194
+    if cp_value == 0x00b7:
195
+        if 0 < pos < len(label)-1:
196
+            if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c:
197
+                return True
198
+        return False
199
+
200
+    elif cp_value == 0x0375:
201
+        if pos < len(label)-1 and len(label) > 1:
202
+            return _is_script(label[pos + 1], 'Greek')
203
+        return False
204
+
205
+    elif cp_value == 0x05f3 or cp_value == 0x05f4:
206
+        if pos > 0:
207
+            return _is_script(label[pos - 1], 'Hebrew')
208
+        return False
209
+
210
+    elif cp_value == 0x30fb:
211
+        for cp in label:
212
+            if cp == u'\u30fb':
213
+                continue
214
+            if not _is_script(cp, 'Hiragana') and not _is_script(cp, 'Katakana') and not _is_script(cp, 'Han'):
215
+                return False
216
+        return True
217
+
218
+    elif 0x660 <= cp_value <= 0x669:
219
+        for cp in label:
220
+            if 0x6f0 <= ord(cp) <= 0x06f9:
221
+                return False
222
+        return True
223
+
224
+    elif 0x6f0 <= cp_value <= 0x6f9:
225
+        for cp in label:
226
+            if 0x660 <= ord(cp) <= 0x0669:
227
+                return False
228
+        return True
229
+
230
+
231
+def check_label(label):
232
+
233
+    if isinstance(label, (bytes, bytearray)):
234
+        label = label.decode('utf-8')
235
+    if len(label) == 0:
236
+        raise IDNAError('Empty Label')
237
+
238
+    check_nfc(label)
239
+    check_hyphen_ok(label)
240
+    check_initial_combiner(label)
241
+
242
+    for (pos, cp) in enumerate(label):
243
+        cp_value = ord(cp)
244
+        if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']):
245
+            continue
246
+        elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']):
247
+            if not valid_contextj(label, pos):
248
+                raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label)))
249
+        elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']):
250
+            if not valid_contexto(label, pos):
251
+                raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label)))
252
+        else:
253
+            raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label)))
254
+
255
+    check_bidi(label)
256
+
257
+
258
+def alabel(label):
259
+
260
+    try:
261
+        label = label.encode('ascii')
262
+        try:
263
+            ulabel(label)
264
+        except:
265
+            raise IDNAError('The label {0} is not a valid A-label'.format(label))
266
+        if not valid_label_length(label):
267
+            raise IDNAError('Label too long')
268
+        return label
269
+    except UnicodeError:
270
+        pass
271
+
272
+    if not label:
273
+        raise IDNAError('No Input')
274
+
275
+    label = unicode(label)
276
+    check_label(label)
277
+    label = _punycode(label)
278
+    label = _alabel_prefix + label
279
+
280
+    if not valid_label_length(label):
281
+        raise IDNAError('Label too long')
282
+
283
+    return label
284
+
285
+
286
+def ulabel(label):
287
+
288
+    if not isinstance(label, (bytes, bytearray)):
289
+        try:
290
+            label = label.encode('ascii')
291
+        except UnicodeError:
292
+            check_label(label)
293
+            return label
294
+
295
+    label = label.lower()
296
+    if label.startswith(_alabel_prefix):
297
+        label = label[len(_alabel_prefix):]
298
+    else:
299
+        check_label(label)
300
+        return label.decode('ascii')
301
+
302
+    label = label.decode('punycode')
303
+    check_label(label)
304
+    return label
305
+
306
+
307
+def uts46_remap(domain, std3_rules=True, transitional=False):
308
+    """Re-map the characters in the string according to UTS46 processing."""
309
+    from .uts46data import uts46data
310
+    output = u""
311
+    try:
312
+        for pos, char in enumerate(domain):
313
+            code_point = ord(char)
314
+            uts46row = uts46data[code_point if code_point < 256 else
315
+                bisect.bisect_left(uts46data, (code_point, "Z")) - 1]
316
+            status = uts46row[1]
317
+            replacement = uts46row[2] if len(uts46row) == 3 else None
318
+            if (status == "V" or
319
+                    (status == "D" and not transitional) or
320
+                    (status == "3" and std3_rules and replacement is None)):
321
+                output += char
322
+            elif replacement is not None and (status == "M" or
323
+                    (status == "3" and std3_rules) or
324
+                    (status == "D" and transitional)):
325
+                output += replacement
326
+            elif status != "I":
327
+                raise IndexError()
328
+        return unicodedata.normalize("NFC", output)
329
+    except IndexError:
330
+        raise InvalidCodepoint(
331
+            "Codepoint {0} not allowed at position {1} in {2}".format(
332
+            _unot(code_point), pos + 1, repr(domain)))
333
+
334
+
335
+def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False):
336
+
337
+    if isinstance(s, (bytes, bytearray)):
338
+        s = s.decode("ascii")
339
+    if uts46:
340
+        s = uts46_remap(s, std3_rules, transitional)
341
+    trailing_dot = False
342
+    result = []
343
+    if strict:
344
+        labels = s.split('.')
345
+    else:
346
+        labels = _unicode_dots_re.split(s)
347
+    while labels and not labels[0]:
348
+        del labels[0]
349
+    if not labels:
350
+        raise IDNAError('Empty domain')
351
+    if labels[-1] == '':
352
+        del labels[-1]
353
+        trailing_dot = True
354
+    for label in labels:
355
+        result.append(alabel(label))
356
+    if trailing_dot:
357
+        result.append(b'')
358
+    s = b'.'.join(result)
359
+    if not valid_string_length(s, trailing_dot):
360
+        raise IDNAError('Domain too long')
361
+    return s
362
+
363
+
364
+def decode(s, strict=False, uts46=False, std3_rules=False):
365
+
366
+    if isinstance(s, (bytes, bytearray)):
367
+        s = s.decode("ascii")
368
+    if uts46:
369
+        s = uts46_remap(s, std3_rules, False)
370
+    trailing_dot = False
371
+    result = []
372
+    if not strict:
373
+        labels = _unicode_dots_re.split(s)
374
+    else:
375
+        labels = s.split(u'.')
376
+    while labels and not labels[0]:
377
+        del labels[0]
378
+    if not labels:
379
+        raise IDNAError('Empty domain')
380
+    if not labels[-1]:
381
+        del labels[-1]
382
+        trailing_dot = True
383
+    for label in labels:
384
+        result.append(ulabel(label))
385
+    if trailing_dot:
386
+        result.append(u'')
387
+    return u'.'.join(result)

+ 1584
- 0
Contents/Libraries/Shared/requests/packages/idna/idnadata.py
File diff suppressed because it is too large
View File


+ 46
- 0
Contents/Libraries/Shared/requests/packages/idna/intranges.py View File

1
+"""
2
+Given a list of integers, made up of (hopefully) a small number of long runs
3
+of consecutive integers, compute a representation of the form
4
+((start1, end1), (start2, end2) ...). Then answer the question "was x present
5
+in the original list?" in time O(log(# runs)).
6
+"""
7
+
8
+import bisect
9
+
10
+def intranges_from_list(list_):
11
+    """Represent a list of integers as a sequence of ranges:
12
+    ((start_0, end_0), (start_1, end_1), ...), such that the original
13
+    integers are exactly those x such that start_i <= x < end_i for some i.
14
+    """
15
+
16
+    sorted_list = sorted(list_)
17
+    ranges = []
18
+    last_write = -1
19
+    for i in range(len(sorted_list)):
20
+        if i+1 < len(sorted_list):
21
+            if sorted_list[i] == sorted_list[i+1]-1:
22
+                continue
23
+        current_range = sorted_list[last_write+1:i+1]
24
+        range_tuple = (current_range[0], current_range[-1] + 1)
25
+        ranges.append(range_tuple)
26
+        last_write = i
27
+
28
+    return tuple(ranges)
29
+
30
+
31
+def intranges_contain(int_, ranges):
32
+    """Determine if `int_` falls into one of the ranges in `ranges`."""
33
+    tuple_ = (int_, int_)
34
+    pos = bisect.bisect_left(ranges, tuple_)
35
+    # we could be immediately ahead of a tuple (start, end)
36
+    # with start < int_ <= end
37
+    if pos > 0:
38
+        left, right = ranges[pos-1]
39
+        if left <= int_ < right:
40
+            return True
41
+    # or we could be immediately behind a tuple (int_, end)
42
+    if pos < len(ranges):
43
+        left, _ = ranges[pos]
44
+        if left == int_:
45
+            return True
46
+    return False

+ 7267
- 0
Contents/Libraries/Shared/requests/packages/idna/uts46data.py
File diff suppressed because it is too large
View File


+ 96
- 0
Contents/Libraries/Shared/requests/packages/urllib3/__init__.py View File

1
+"""
2
+urllib3 - Thread-safe connection pooling and re-using.
3
+"""
4
+
5
+from __future__ import absolute_import
6
+import warnings
7
+
8
+from .connectionpool import (
9
+    HTTPConnectionPool,
10
+    HTTPSConnectionPool,
11
+    connection_from_url
12
+)
13
+
14
+from . import exceptions
15
+from .filepost import encode_multipart_formdata
16
+from .poolmanager import PoolManager, ProxyManager, proxy_from_url
17
+from .response import HTTPResponse
18
+from .util.request import make_headers
19
+from .util.url import get_host
20
+from .util.timeout import Timeout
21
+from .util.retry import Retry
22
+
23
+
24
+# Set default logging handler to avoid "No handler found" warnings.
25
+import logging
26
+try:  # Python 2.7+
27
+    from logging import NullHandler
28
+except ImportError:
29
+    class NullHandler(logging.Handler):
30
+        def emit(self, record):
31
+            pass
32
+
33
+__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
34
+__license__ = 'MIT'
35
+__version__ = '1.16'
36
+
37
+__all__ = (
38
+    'HTTPConnectionPool',
39
+    'HTTPSConnectionPool',
40
+    'PoolManager',
41
+    'ProxyManager',
42
+    'HTTPResponse',
43
+    'Retry',
44
+    'Timeout',
45
+    'add_stderr_logger',
46
+    'connection_from_url',
47
+    'disable_warnings',
48
+    'encode_multipart_formdata',
49
+    'get_host',
50
+    'make_headers',
51
+    'proxy_from_url',
52
+)
53
+
54
+logging.getLogger(__name__).addHandler(NullHandler())
55
+
56
+
57
+def add_stderr_logger(level=logging.DEBUG):
58
+    """
59
+    Helper for quickly adding a StreamHandler to the logger. Useful for
60
+    debugging.
61
+
62
+    Returns the handler after adding it.
63
+    """
64
+    # This method needs to be in this __init__.py to get the __name__ correct
65
+    # even if urllib3 is vendored within another package.
66
+    logger = logging.getLogger(__name__)
67
+    handler = logging.StreamHandler()
68
+    handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
69
+    logger.addHandler(handler)
70
+    logger.setLevel(level)
71
+    logger.debug('Added a stderr logging handler to logger: %s', __name__)
72
+    return handler
73
+
74
+# ... Clean up.
75
+del NullHandler
76
+
77
+
78
+# All warning filters *must* be appended unless you're really certain that they
79
+# shouldn't be: otherwise, it's very hard for users to use most Python
80
+# mechanisms to silence them.
81
+# SecurityWarning's always go off by default.
82
+warnings.simplefilter('always', exceptions.SecurityWarning, append=True)
83
+# SubjectAltNameWarning's should go off once per host
84
+warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True)
85
+# InsecurePlatformWarning's don't vary between requests, so we keep it default.
86
+warnings.simplefilter('default', exceptions.InsecurePlatformWarning,
87
+                      append=True)
88
+# SNIMissingWarnings should go off only once.
89
+warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True)
90
+
91
+
92
+def disable_warnings(category=exceptions.HTTPWarning):
93
+    """
94
+    Helper for quickly disabling all urllib3 warnings.
95
+    """
96
+    warnings.simplefilter('ignore', category)

+ 324
- 0
Contents/Libraries/Shared/requests/packages/urllib3/_collections.py View File

1
+from __future__ import absolute_import
2
+from collections import Mapping, MutableMapping
3
+try:
4
+    from threading import RLock
5
+except ImportError:  # Platform-specific: No threads available
6
+    class RLock:
7
+        def __enter__(self):
8
+            pass
9
+
10
+        def __exit__(self, exc_type, exc_value, traceback):
11
+            pass
12
+
13
+
14
+try:  # Python 2.7+
15
+    from collections import OrderedDict
16
+except ImportError:
17
+    from .packages.ordered_dict import OrderedDict
18
+from .packages.six import iterkeys, itervalues, PY3
19
+
20
+
21
+__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict']
22
+
23
+
24
+_Null = object()
25
+
26
+
27
+class RecentlyUsedContainer(MutableMapping):
28
+    """
29
+    Provides a thread-safe dict-like container which maintains up to
30
+    ``maxsize`` keys while throwing away the least-recently-used keys beyond
31
+    ``maxsize``.
32
+
33
+    :param maxsize:
34
+        Maximum number of recent elements to retain.
35
+
36
+    :param dispose_func:
37
+        Every time an item is evicted from the container,
38
+        ``dispose_func(value)`` is called.  Callback which will get called
39
+    """
40
+
41
+    ContainerCls = OrderedDict
42
+
43
+    def __init__(self, maxsize=10, dispose_func=None):
44
+        self._maxsize = maxsize
45
+        self.dispose_func = dispose_func
46
+
47
+        self._container = self.ContainerCls()
48
+        self.lock = RLock()
49
+
50
+    def __getitem__(self, key):
51
+        # Re-insert the item, moving it to the end of the eviction line.
52
+        with self.lock:
53
+            item = self._container.pop(key)
54
+            self._container[key] = item
55
+            return item
56
+
57
+    def __setitem__(self, key, value):
58
+        evicted_value = _Null
59
+        with self.lock:
60
+            # Possibly evict the existing value of 'key'
61
+            evicted_value = self._container.get(key, _Null)
62
+            self._container[key] = value
63
+
64
+            # If we didn't evict an existing value, we might have to evict the
65
+            # least recently used item from the beginning of the container.
66
+            if len(self._container) > self._maxsize:
67
+                _key, evicted_value = self._container.popitem(last=False)
68
+
69
+        if self.dispose_func and evicted_value is not _Null:
70
+            self.dispose_func(evicted_value)
71
+
72
+    def __delitem__(self, key):
73
+        with self.lock:
74
+            value = self._container.pop(key)
75
+
76
+        if self.dispose_func:
77
+            self.dispose_func(value)
78
+
79
+    def __len__(self):
80
+        with self.lock:
81
+            return len(self._container)
82
+
83
+    def __iter__(self):
84
+        raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.')
85
+
86
+    def clear(self):
87
+        with self.lock:
88
+            # Copy pointers to all values, then wipe the mapping
89
+            values = list(itervalues(self._container))
90
+            self._container.clear()
91
+
92
+        if self.dispose_func:
93
+            for value in values:
94
+                self.dispose_func(value)
95
+
96
+    def keys(self):
97
+        with self.lock:
98
+            return list(iterkeys(self._container))
99
+
100
+
101
+class HTTPHeaderDict(MutableMapping):
102
+    """
103
+    :param headers:
104
+        An iterable of field-value pairs. Must not contain multiple field names
105
+        when compared case-insensitively.
106
+
107
+    :param kwargs:
108
+        Additional field-value pairs to pass in to ``dict.update``.
109
+
110
+    A ``dict`` like container for storing HTTP Headers.
111
+
112
+    Field names are stored and compared case-insensitively in compliance with
113
+    RFC 7230. Iteration provides the first case-sensitive key seen for each
114
+    case-insensitive pair.
115
+
116
+    Using ``__setitem__`` syntax overwrites fields that compare equal
117
+    case-insensitively in order to maintain ``dict``'s api. For fields that
118
+    compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add``
119
+    in a loop.
120
+
121
+    If multiple fields that are equal case-insensitively are passed to the
122
+    constructor or ``.update``, the behavior is undefined and some will be
123
+    lost.
124
+
125
+    >>> headers = HTTPHeaderDict()
126
+    >>> headers.add('Set-Cookie', 'foo=bar')
127
+    >>> headers.add('set-cookie', 'baz=quxx')
128
+    >>> headers['content-length'] = '7'
129
+    >>> headers['SET-cookie']
130
+    'foo=bar, baz=quxx'
131
+    >>> headers['Content-Length']
132
+    '7'
133
+    """
134
+
135
+    def __init__(self, headers=None, **kwargs):
136
+        super(HTTPHeaderDict, self).__init__()
137
+        self._container = OrderedDict()
138
+        if headers is not None:
139
+            if isinstance(headers, HTTPHeaderDict):
140
+                self._copy_from(headers)
141
+            else:
142
+                self.extend(headers)
143
+        if kwargs:
144
+            self.extend(kwargs)
145
+
146
+    def __setitem__(self, key, val):
147
+        self._container[key.lower()] = (key, val)
148
+        return self._container[key.lower()]
149
+
150
+    def __getitem__(self, key):
151
+        val = self._container[key.lower()]
152
+        return ', '.join(val[1:])
153
+
154
+    def __delitem__(self, key):
155
+        del self._container[key.lower()]
156
+
157
+    def __contains__(self, key):
158
+        return key.lower() in self._container
159
+
160
+    def __eq__(self, other):
161
+        if not isinstance(other, Mapping) and not hasattr(other, 'keys'):
162
+            return False
163
+        if not isinstance(other, type(self)):
164
+            other = type(self)(other)
165
+        return (dict((k.lower(), v) for k, v in self.itermerged()) ==
166
+                dict((k.lower(), v) for k, v in other.itermerged()))
167
+
168
+    def __ne__(self, other):
169
+        return not self.__eq__(other)
170
+
171
+    if not PY3:  # Python 2
172
+        iterkeys = MutableMapping.iterkeys
173
+        itervalues = MutableMapping.itervalues
174
+
175
+    __marker = object()
176
+
177
+    def __len__(self):
178
+        return len(self._container)
179
+
180
+    def __iter__(self):
181
+        # Only provide the originally cased names
182
+        for vals in self._container.values():
183
+            yield vals[0]
184
+
185
+    def pop(self, key, default=__marker):
186
+        '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
187
+          If key is not found, d is returned if given, otherwise KeyError is raised.
188
+        '''
189
+        # Using the MutableMapping function directly fails due to the private marker.
190
+        # Using ordinary dict.pop would expose the internal structures.
191
+        # So let's reinvent the wheel.
192
+        try:
193
+            value = self[key]
194
+        except KeyError:
195
+            if default is self.__marker:
196
+                raise
197
+            return default
198
+        else:
199
+            del self[key]
200
+            return value
201
+
202
+    def discard(self, key):
203
+        try:
204
+            del self[key]
205
+        except KeyError:
206
+            pass
207
+
208
+    def add(self, key, val):
209
+        """Adds a (name, value) pair, doesn't overwrite the value if it already
210
+        exists.
211
+
212
+        >>> headers = HTTPHeaderDict(foo='bar')
213
+        >>> headers.add('Foo', 'baz')
214
+        >>> headers['foo']
215
+        'bar, baz'
216
+        """
217
+        key_lower = key.lower()
218
+        new_vals = key, val
219
+        # Keep the common case aka no item present as fast as possible
220
+        vals = self._container.setdefault(key_lower, new_vals)
221
+        if new_vals is not vals:
222
+            # new_vals was not inserted, as there was a previous one
223
+            if isinstance(vals, list):
224
+                # If already several items got inserted, we have a list
225
+                vals.append(val)
226
+            else:
227
+                # vals should be a tuple then, i.e. only one item so far
228
+                # Need to convert the tuple to list for further extension
229
+                self._container[key_lower] = [vals[0], vals[1], val]
230
+
231
+    def extend(self, *args, **kwargs):
232
+        """Generic import function for any type of header-like object.
233
+        Adapted version of MutableMapping.update in order to insert items
234
+        with self.add instead of self.__setitem__
235
+        """
236
+        if len(args) > 1:
237
+            raise TypeError("extend() takes at most 1 positional "
238
+                            "arguments ({0} given)".format(len(args)))
239
+        other = args[0] if len(args) >= 1 else ()
240
+
241
+        if isinstance(other, HTTPHeaderDict):
242
+            for key, val in other.iteritems():
243
+                self.add(key, val)
244
+        elif isinstance(other, Mapping):
245
+            for key in other:
246
+                self.add(key, other[key])
247
+        elif hasattr(other, "keys"):
248
+            for key in other.keys():
249
+                self.add(key, other[key])
250
+        else:
251
+            for key, value in other:
252
+                self.add(key, value)
253
+
254
+        for key, value in kwargs.items():
255
+            self.add(key, value)
256
+
257
+    def getlist(self, key):
258
+        """Returns a list of all the values for the named field. Returns an
259
+        empty list if the key doesn't exist."""
260
+        try:
261
+            vals = self._container[key.lower()]
262
+        except KeyError:
263
+            return []
264
+        else:
265
+            if isinstance(vals, tuple):
266
+                return [vals[1]]
267
+            else:
268
+                return vals[1:]
269
+
270
+    # Backwards compatibility for httplib
271
+    getheaders = getlist
272
+    getallmatchingheaders = getlist
273
+    iget = getlist
274
+
275
+    def __repr__(self):
276
+        return "%s(%s)" % (type(self).__name__, dict(self.itermerged()))
277
+
278
+    def _copy_from(self, other):
279
+        for key in other:
280
+            val = other.getlist(key)
281
+            if isinstance(val, list):
282
+                # Don't need to convert tuples
283
+                val = list(val)
284
+            self._container[key.lower()] = [key] + val
285
+
286
+    def copy(self):
287
+        clone = type(self)()
288
+        clone._copy_from(self)
289
+        return clone
290
+
291
+    def iteritems(self):
292
+        """Iterate over all header lines, including duplicate ones."""
293
+        for key in self:
294
+            vals = self._container[key.lower()]
295
+            for val in vals[1:]:
296
+                yield vals[0], val
297
+
298
+    def itermerged(self):
299
+        """Iterate over all headers, merging duplicate ones together."""
300
+        for key in self:
301
+            val = self._container[key.lower()]
302
+            yield val[0], ', '.join(val[1:])
303
+
304
+    def items(self):
305
+        return list(self.iteritems())
306
+
307
+    @classmethod
308
+    def from_httplib(cls, message):  # Python 2
309
+        """Read headers from a Python 2 httplib message object."""
310
+        # python2.7 does not expose a proper API for exporting multiheaders
311
+        # efficiently. This function re-reads raw lines from the message
312
+        # object and extracts the multiheaders properly.
313
+        headers = []
314
+
315
+        for line in message.headers:
316
+            if line.startswith((' ', '\t')):
317
+                key, value = headers[-1]
318
+                headers[-1] = (key, value + '\r\n' + line.rstrip())
319
+                continue
320
+
321
+            key, value = line.split(':', 1)
322
+            headers.append((key, value.strip()))
323
+
324
+        return cls(headers)

+ 330
- 0
Contents/Libraries/Shared/requests/packages/urllib3/connection.py View File

1
+from __future__ import absolute_import
2
+import datetime
3
+import logging
4
+import os
5
+import sys
6
+import socket
7
+from socket import error as SocketError, timeout as SocketTimeout
8
+import warnings
9
+from .packages import six
10
+
11
+try:  # Python 3
12
+    from http.client import HTTPConnection as _HTTPConnection
13
+    from http.client import HTTPException  # noqa: unused in this module
14
+except ImportError:
15
+    from httplib import HTTPConnection as _HTTPConnection
16
+    from httplib import HTTPException  # noqa: unused in this module
17
+
18
+try:  # Compiled with SSL?
19
+    import ssl
20
+    BaseSSLError = ssl.SSLError
21
+except (ImportError, AttributeError):  # Platform-specific: No SSL.
22
+    ssl = None
23
+
24
+    class BaseSSLError(BaseException):
25
+        pass
26
+
27
+
28
+try:  # Python 3:
29
+    # Not a no-op, we're adding this to the namespace so it can be imported.
30
+    ConnectionError = ConnectionError
31
+except NameError:  # Python 2:
32
+    class ConnectionError(Exception):
33
+        pass
34
+
35
+
36
+from .exceptions import (
37
+    NewConnectionError,
38
+    ConnectTimeoutError,
39
+    SubjectAltNameWarning,
40
+    SystemTimeWarning,
41
+)
42
+from .packages.ssl_match_hostname import match_hostname, CertificateError
43
+
44
+from .util.ssl_ import (
45
+    resolve_cert_reqs,
46
+    resolve_ssl_version,
47
+    ssl_wrap_socket,
48
+    assert_fingerprint,
49
+)
50
+
51
+
52
+from .util import connection
53
+
54
+from ._collections import HTTPHeaderDict
55
+
56
+log = logging.getLogger(__name__)
57
+
58
+port_by_scheme = {
59
+    'http': 80,
60
+    'https': 443,
61
+}
62
+
63
+RECENT_DATE = datetime.date(2014, 1, 1)
64
+
65
+
66
+class DummyConnection(object):
67
+    """Used to detect a failed ConnectionCls import."""
68
+    pass
69
+
70
+
71
+class HTTPConnection(_HTTPConnection, object):
72
+    """
73
+    Based on httplib.HTTPConnection but provides an extra constructor
74
+    backwards-compatibility layer between older and newer Pythons.
75
+
76
+    Additional keyword parameters are used to configure attributes of the connection.
77
+    Accepted parameters include:
78
+
79
+      - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool`
80
+      - ``source_address``: Set the source address for the current connection.
81
+
82
+        .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x
83
+
84
+      - ``socket_options``: Set specific options on the underlying socket. If not specified, then
85
+        defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling
86
+        Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy.
87
+
88
+        For example, if you wish to enable TCP Keep Alive in addition to the defaults,
89
+        you might pass::
90
+
91
+            HTTPConnection.default_socket_options + [
92
+                (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
93
+            ]
94
+
95
+        Or you may want to disable the defaults by passing an empty list (e.g., ``[]``).
96
+    """
97
+
98
+    default_port = port_by_scheme['http']
99
+
100
+    #: Disable Nagle's algorithm by default.
101
+    #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]``
102
+    default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]
103
+
104
+    #: Whether this connection verifies the host's certificate.
105
+    is_verified = False
106
+
107
+    def __init__(self, *args, **kw):
108
+        if six.PY3:  # Python 3
109
+            kw.pop('strict', None)
110
+
111
+        # Pre-set source_address in case we have an older Python like 2.6.
112
+        self.source_address = kw.get('source_address')
113
+
114
+        if sys.version_info < (2, 7):  # Python 2.6
115
+            # _HTTPConnection on Python 2.6 will balk at this keyword arg, but
116
+            # not newer versions. We can still use it when creating a
117
+            # connection though, so we pop it *after* we have saved it as
118
+            # self.source_address.
119
+            kw.pop('source_address', None)
120
+
121
+        #: The socket options provided by the user. If no options are
122
+        #: provided, we use the default options.
123
+        self.socket_options = kw.pop('socket_options', self.default_socket_options)
124
+
125
+        # Superclass also sets self.source_address in Python 2.7+.
126
+        _HTTPConnection.__init__(self, *args, **kw)
127
+
128
+    def _new_conn(self):
129
+        """ Establish a socket connection and set nodelay settings on it.
130
+
131
+        :return: New socket connection.
132
+        """
133
+        extra_kw = {}
134
+        if self.source_address:
135
+            extra_kw['source_address'] = self.source_address
136
+
137
+        if self.socket_options:
138
+            extra_kw['socket_options'] = self.socket_options
139
+
140
+        try:
141
+            conn = connection.create_connection(
142
+                (self.host, self.port), self.timeout, **extra_kw)
143
+
144
+        except SocketTimeout as e:
145
+            raise ConnectTimeoutError(
146
+                self, "Connection to %s timed out. (connect timeout=%s)" %
147
+                (self.host, self.timeout))
148
+
149
+        except SocketError as e:
150
+            raise NewConnectionError(
151
+                self, "Failed to establish a new connection: %s" % e)
152
+
153
+        return conn
154
+
155
+    def _prepare_conn(self, conn):
156
+        self.sock = conn
157
+        # the _tunnel_host attribute was added in python 2.6.3 (via
158
+        # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do
159
+        # not have them.
160
+        if getattr(self, '_tunnel_host', None):
161
+            # TODO: Fix tunnel so it doesn't depend on self.sock state.
162
+            self._tunnel()
163
+            # Mark this connection as not reusable
164
+            self.auto_open = 0
165
+
166
+    def connect(self):
167
+        conn = self._new_conn()
168
+        self._prepare_conn(conn)
169
+
170
+    def request_chunked(self, method, url, body=None, headers=None):
171
+        """
172
+        Alternative to the common request method, which sends the
173
+        body with chunked encoding and not as one block
174
+        """
175
+        headers = HTTPHeaderDict(headers if headers is not None else {})
176
+        skip_accept_encoding = 'accept-encoding' in headers
177
+        self.putrequest(method, url, skip_accept_encoding=skip_accept_encoding)
178
+        for header, value in headers.items():
179
+            self.putheader(header, value)
180
+        if 'transfer-encoding' not in headers:
181
+            self.putheader('Transfer-Encoding', 'chunked')
182
+        self.endheaders()
183
+
184
+        if body is not None:
185
+            stringish_types = six.string_types + (six.binary_type,)
186
+            if isinstance(body, stringish_types):
187
+                body = (body,)
188
+            for chunk in body:
189
+                if not chunk:
190
+                    continue
191
+                if not isinstance(chunk, six.binary_type):
192
+                    chunk = chunk.encode('utf8')
193
+                len_str = hex(len(chunk))[2:]
194
+                self.send(len_str.encode('utf-8'))
195
+                self.send(b'\r\n')
196
+                self.send(chunk)
197
+                self.send(b'\r\n')
198
+
199
+        # After the if clause, to always have a closed body
200
+        self.send(b'0\r\n\r\n')
201
+
202
+
203
+class HTTPSConnection(HTTPConnection):
204
+    default_port = port_by_scheme['https']
205
+
206
+    def __init__(self, host, port=None, key_file=None, cert_file=None,
207
+                 strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, **kw):
208
+
209
+        HTTPConnection.__init__(self, host, port, strict=strict,
210
+                                timeout=timeout, **kw)
211
+
212
+        self.key_file = key_file
213
+        self.cert_file = cert_file
214
+
215
+        # Required property for Google AppEngine 1.9.0 which otherwise causes
216
+        # HTTPS requests to go out as HTTP. (See Issue #356)
217
+        self._protocol = 'https'
218
+
219
+    def connect(self):
220
+        conn = self._new_conn()
221
+        self._prepare_conn(conn)
222
+        self.sock = ssl.wrap_socket(conn, self.key_file, self.cert_file)
223
+
224
+
225
+class VerifiedHTTPSConnection(HTTPSConnection):
226
+    """
227
+    Based on httplib.HTTPSConnection but wraps the socket with
228
+    SSL certification.
229
+    """
230
+    cert_reqs = None
231
+    ca_certs = None
232
+    ca_cert_dir = None
233
+    ssl_version = None
234
+    assert_fingerprint = None
235
+
236
+    def set_cert(self, key_file=None, cert_file=None,
237
+                 cert_reqs=None, ca_certs=None,
238
+                 assert_hostname=None, assert_fingerprint=None,
239
+                 ca_cert_dir=None):
240
+
241
+        if (ca_certs or ca_cert_dir) and cert_reqs is None:
242
+            cert_reqs = 'CERT_REQUIRED'
243
+
244
+        self.key_file = key_file
245
+        self.cert_file = cert_file
246
+        self.cert_reqs = cert_reqs
247
+        self.assert_hostname = assert_hostname
248
+        self.assert_fingerprint = assert_fingerprint
249
+        self.ca_certs = ca_certs and os.path.expanduser(ca_certs)
250
+        self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir)
251
+
252
+    def connect(self):
253
+        # Add certificate verification
254
+        conn = self._new_conn()
255
+
256
+        resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs)
257
+        resolved_ssl_version = resolve_ssl_version(self.ssl_version)
258
+
259
+        hostname = self.host
260
+        if getattr(self, '_tunnel_host', None):
261
+            # _tunnel_host was added in Python 2.6.3
262
+            # (See: http://hg.python.org/cpython/rev/0f57b30a152f)
263
+
264
+            self.sock = conn
265
+            # Calls self._set_hostport(), so self.host is
266
+            # self._tunnel_host below.
267
+            self._tunnel()
268
+            # Mark this connection as not reusable
269
+            self.auto_open = 0
270
+
271
+            # Override the host with the one we're requesting data from.
272
+            hostname = self._tunnel_host
273
+
274
+        is_time_off = datetime.date.today() < RECENT_DATE
275
+        if is_time_off:
276
+            warnings.warn((
277
+                'System time is way off (before {0}). This will probably '
278
+                'lead to SSL verification errors').format(RECENT_DATE),
279
+                SystemTimeWarning
280
+            )
281
+
282
+        # Wrap socket using verification with the root certs in
283
+        # trusted_root_certs
284
+        self.sock = ssl_wrap_socket(conn, self.key_file, self.cert_file,
285
+                                    cert_reqs=resolved_cert_reqs,
286
+                                    ca_certs=self.ca_certs,
287
+                                    ca_cert_dir=self.ca_cert_dir,
288
+                                    server_hostname=hostname,
289
+                                    ssl_version=resolved_ssl_version)
290
+
291
+        if self.assert_fingerprint:
292
+            assert_fingerprint(self.sock.getpeercert(binary_form=True),
293
+                               self.assert_fingerprint)
294
+        elif resolved_cert_reqs != ssl.CERT_NONE \
295
+                and self.assert_hostname is not False:
296
+            cert = self.sock.getpeercert()
297
+            if not cert.get('subjectAltName', ()):
298
+                warnings.warn((
299
+                    'Certificate for {0} has no `subjectAltName`, falling back to check for a '
300
+                    '`commonName` for now. This feature is being removed by major browsers and '
301
+                    'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 '
302
+                    'for details.)'.format(hostname)),
303
+                    SubjectAltNameWarning
304
+                )
305
+            _match_hostname(cert, self.assert_hostname or hostname)
306
+
307
+        self.is_verified = (resolved_cert_reqs == ssl.CERT_REQUIRED or
308
+                            self.assert_fingerprint is not None)
309
+
310
+
311
+def _match_hostname(cert, asserted_hostname):
312
+    try:
313
+        match_hostname(cert, asserted_hostname)
314
+    except CertificateError as e:
315
+        log.error(
316
+            'Certificate did not match expected hostname: %s. '
317
+            'Certificate: %s', asserted_hostname, cert
318
+        )
319
+        # Add cert to exception and reraise so client code can inspect
320
+        # the cert when catching the exception, if they want to
321
+        e._peer_cert = cert
322
+        raise
323
+
324
+
325
+if ssl:
326
+    # Make a copy for testing.
327
+    UnverifiedHTTPSConnection = HTTPSConnection
328
+    HTTPSConnection = VerifiedHTTPSConnection
329
+else:
330
+    HTTPSConnection = DummyConnection

+ 866
- 0
Contents/Libraries/Shared/requests/packages/urllib3/connectionpool.py View File

1
+from __future__ import absolute_import
2
+import errno
3
+import logging
4
+import sys
5
+import warnings
6
+
7
+from socket import error as SocketError, timeout as SocketTimeout
8
+import socket
9
+
10
+try:  # Python 3
11
+    from queue import LifoQueue, Empty, Full
12
+except ImportError:
13
+    from Queue import LifoQueue, Empty, Full
14
+    # Queue is imported for side effects on MS Windows
15
+    import Queue as _unused_module_Queue  # noqa: unused
16
+
17
+
18
+from .exceptions import (
19
+    ClosedPoolError,
20
+    ProtocolError,
21
+    EmptyPoolError,
22
+    HeaderParsingError,
23
+    HostChangedError,
24
+    LocationValueError,
25
+    MaxRetryError,
26
+    ProxyError,
27
+    ReadTimeoutError,
28
+    SSLError,
29
+    TimeoutError,
30
+    InsecureRequestWarning,
31
+    NewConnectionError,
32
+)
33
+from .packages.ssl_match_hostname import CertificateError
34
+from .packages import six
35
+from .connection import (
36
+    port_by_scheme,
37
+    DummyConnection,
38
+    HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection,
39
+    HTTPException, BaseSSLError,
40
+)
41
+from .request import RequestMethods
42
+from .response import HTTPResponse
43
+
44
+from .util.connection import is_connection_dropped
45
+from .util.response import assert_header_parsing
46
+from .util.retry import Retry
47
+from .util.timeout import Timeout
48
+from .util.url import get_host, Url
49
+
50
+
51
+xrange = six.moves.xrange
52
+
53
+log = logging.getLogger(__name__)
54
+
55
+_Default = object()
56
+
57
+
58
+# Pool objects
59
+class ConnectionPool(object):
60
+    """
61
+    Base class for all connection pools, such as
62
+    :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`.
63
+    """
64
+
65
+    scheme = None
66
+    QueueCls = LifoQueue
67
+
68
+    def __init__(self, host, port=None):
69
+        if not host:
70
+            raise LocationValueError("No host specified.")
71
+
72
+        # httplib doesn't like it when we include brackets in ipv6 addresses
73
+        # Specifically, if we include brackets but also pass the port then
74
+        # httplib crazily doubles up the square brackets on the Host header.
75
+        # Instead, we need to make sure we never pass ``None`` as the port.
76
+        # However, for backward compatibility reasons we can't actually
77
+        # *assert* that.
78
+        self.host = host.strip('[]')
79
+        self.port = port
80
+
81
+    def __str__(self):
82
+        return '%s(host=%r, port=%r)' % (type(self).__name__,
83
+                                         self.host, self.port)
84
+
85
+    def __enter__(self):
86
+        return self
87
+
88
+    def __exit__(self, exc_type, exc_val, exc_tb):
89
+        self.close()
90
+        # Return False to re-raise any potential exceptions
91
+        return False
92
+
93
+    def close(self):
94
+        """
95
+        Close all pooled connections and disable the pool.
96
+        """
97
+        pass
98
+
99
+
100
+# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252
101
+_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK])
102
+
103
+
104
+class HTTPConnectionPool(ConnectionPool, RequestMethods):
105
+    """
106
+    Thread-safe connection pool for one host.
107
+
108
+    :param host:
109
+        Host used for this HTTP Connection (e.g. "localhost"), passed into
110
+        :class:`httplib.HTTPConnection`.
111
+
112
+    :param port:
113
+        Port used for this HTTP Connection (None is equivalent to 80), passed
114
+        into :class:`httplib.HTTPConnection`.
115
+
116
+    :param strict:
117
+        Causes BadStatusLine to be raised if the status line can't be parsed
118
+        as a valid HTTP/1.0 or 1.1 status line, passed into
119
+        :class:`httplib.HTTPConnection`.
120
+
121
+        .. note::
122
+           Only works in Python 2. This parameter is ignored in Python 3.
123
+
124
+    :param timeout:
125
+        Socket timeout in seconds for each individual connection. This can
126
+        be a float or integer, which sets the timeout for the HTTP request,
127
+        or an instance of :class:`urllib3.util.Timeout` which gives you more
128
+        fine-grained control over request timeouts. After the constructor has
129
+        been parsed, this is always a `urllib3.util.Timeout` object.
130
+
131
+    :param maxsize:
132
+        Number of connections to save that can be reused. More than 1 is useful
133
+        in multithreaded situations. If ``block`` is set to False, more
134
+        connections will be created but they will not be saved once they've
135
+        been used.
136
+
137
+    :param block:
138
+        If set to True, no more than ``maxsize`` connections will be used at
139
+        a time. When no free connections are available, the call will block
140
+        until a connection has been released. This is a useful side effect for
141
+        particular multithreaded situations where one does not want to use more
142
+        than maxsize connections per host to prevent flooding.
143
+
144
+    :param headers:
145
+        Headers to include with all requests, unless other headers are given
146
+        explicitly.
147
+
148
+    :param retries:
149
+        Retry configuration to use by default with requests in this pool.
150
+
151
+    :param _proxy:
152
+        Parsed proxy URL, should not be used directly, instead, see
153
+        :class:`urllib3.connectionpool.ProxyManager`"
154
+
155
+    :param _proxy_headers:
156
+        A dictionary with proxy headers, should not be used directly,
157
+        instead, see :class:`urllib3.connectionpool.ProxyManager`"
158
+
159
+    :param \**conn_kw:
160
+        Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`,
161
+        :class:`urllib3.connection.HTTPSConnection` instances.
162
+    """
163
+
164
+    scheme = 'http'
165
+    ConnectionCls = HTTPConnection
166
+    ResponseCls = HTTPResponse
167
+
168
+    def __init__(self, host, port=None, strict=False,
169
+                 timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False,
170
+                 headers=None, retries=None,
171
+                 _proxy=None, _proxy_headers=None,
172
+                 **conn_kw):
173
+        ConnectionPool.__init__(self, host, port)
174
+        RequestMethods.__init__(self, headers)
175
+
176
+        self.strict = strict
177
+
178
+        if not isinstance(timeout, Timeout):
179
+            timeout = Timeout.from_float(timeout)
180
+
181
+        if retries is None:
182
+            retries = Retry.DEFAULT
183
+
184
+        self.timeout = timeout
185
+        self.retries = retries
186
+
187
+        self.pool = self.QueueCls(maxsize)
188
+        self.block = block
189
+
190
+        self.proxy = _proxy
191
+        self.proxy_headers = _proxy_headers or {}
192
+
193
+        # Fill the queue up so that doing get() on it will block properly
194
+        for _ in xrange(maxsize):
195
+            self.pool.put(None)
196
+
197
+        # These are mostly for testing and debugging purposes.
198
+        self.num_connections = 0
199
+        self.num_requests = 0
200
+        self.conn_kw = conn_kw
201
+
202
+        if self.proxy:
203
+            # Enable Nagle's algorithm for proxies, to avoid packet fragmentation.
204
+            # We cannot know if the user has added default socket options, so we cannot replace the
205
+            # list.
206
+            self.conn_kw.setdefault('socket_options', [])
207
+
208
+    def _new_conn(self):
209
+        """
210
+        Return a fresh :class:`HTTPConnection`.
211
+        """
212
+        self.num_connections += 1
213
+        log.info("Starting new HTTP connection (%d): %s",
214
+                 self.num_connections, self.host)
215
+
216
+        conn = self.ConnectionCls(host=self.host, port=self.port,
217
+                                  timeout=self.timeout.connect_timeout,
218
+                                  strict=self.strict, **self.conn_kw)
219
+        return conn
220
+
221
+    def _get_conn(self, timeout=None):
222
+        """
223
+        Get a connection. Will return a pooled connection if one is available.
224
+
225
+        If no connections are available and :prop:`.block` is ``False``, then a
226
+        fresh connection is returned.
227
+
228
+        :param timeout:
229
+            Seconds to wait before giving up and raising
230
+            :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and
231
+            :prop:`.block` is ``True``.
232
+        """
233
+        conn = None
234
+        try:
235
+            conn = self.pool.get(block=self.block, timeout=timeout)
236
+
237
+        except AttributeError:  # self.pool is None
238
+            raise ClosedPoolError(self, "Pool is closed.")
239
+
240
+        except Empty:
241
+            if self.block:
242
+                raise EmptyPoolError(self,
243
+                                     "Pool reached maximum size and no more "
244
+                                     "connections are allowed.")
245
+            pass  # Oh well, we'll create a new connection then
246
+
247
+        # If this is a persistent connection, check if it got disconnected
248
+        if conn and is_connection_dropped(conn):
249
+            log.info("Resetting dropped connection: %s", self.host)
250
+            conn.close()
251
+            if getattr(conn, 'auto_open', 1) == 0:
252
+                # This is a proxied connection that has been mutated by
253
+                # httplib._tunnel() and cannot be reused (since it would
254
+                # attempt to bypass the proxy)
255
+                conn = None
256
+
257
+        return conn or self._new_conn()
258
+
259
+    def _put_conn(self, conn):
260
+        """
261
+        Put a connection back into the pool.
262
+
263
+        :param conn:
264
+            Connection object for the current host and port as returned by
265
+            :meth:`._new_conn` or :meth:`._get_conn`.
266
+
267
+        If the pool is already full, the connection is closed and discarded
268
+        because we exceeded maxsize. If connections are discarded frequently,
269
+        then maxsize should be increased.
270
+
271
+        If the pool is closed, then the connection will be closed and discarded.
272
+        """
273
+        try:
274
+            self.pool.put(conn, block=False)
275
+            return  # Everything is dandy, done.
276
+        except AttributeError:
277
+            # self.pool is None.
278
+            pass
279
+        except Full:
280
+            # This should never happen if self.block == True
281
+            log.warning(
282
+                "Connection pool is full, discarding connection: %s",
283
+                self.host)
284
+
285
+        # Connection never got put back into the pool, close it.
286
+        if conn:
287
+            conn.close()
288
+
289
+    def _validate_conn(self, conn):
290
+        """
291
+        Called right before a request is made, after the socket is created.
292
+        """
293
+        pass
294
+
295
+    def _prepare_proxy(self, conn):
296
+        # Nothing to do for HTTP connections.
297
+        pass
298
+
299
+    def _get_timeout(self, timeout):
300
+        """ Helper that always returns a :class:`urllib3.util.Timeout` """
301
+        if timeout is _Default:
302
+            return self.timeout.clone()
303
+
304
+        if isinstance(timeout, Timeout):
305
+            return timeout.clone()
306
+        else:
307
+            # User passed us an int/float. This is for backwards compatibility,
308
+            # can be removed later
309
+            return Timeout.from_float(timeout)
310
+
311
+    def _raise_timeout(self, err, url, timeout_value):
312
+        """Is the error actually a timeout? Will raise a ReadTimeout or pass"""
313
+
314
+        if isinstance(err, SocketTimeout):
315
+            raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
316
+
317
+        # See the above comment about EAGAIN in Python 3. In Python 2 we have
318
+        # to specifically catch it and throw the timeout error
319
+        if hasattr(err, 'errno') and err.errno in _blocking_errnos:
320
+            raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
321
+
322
+        # Catch possible read timeouts thrown as SSL errors. If not the
323
+        # case, rethrow the original. We need to do this because of:
324
+        # http://bugs.python.org/issue10272
325
+        if 'timed out' in str(err) or 'did not complete (read)' in str(err):  # Python 2.6
326
+            raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
327
+
328
+    def _make_request(self, conn, method, url, timeout=_Default, chunked=False,
329
+                      **httplib_request_kw):
330
+        """
331
+        Perform a request on a given urllib connection object taken from our
332
+        pool.
333
+
334
+        :param conn:
335
+            a connection from one of our connection pools
336
+
337
+        :param timeout:
338
+            Socket timeout in seconds for the request. This can be a
339
+            float or integer, which will set the same timeout value for
340
+            the socket connect and the socket read, or an instance of
341
+            :class:`urllib3.util.Timeout`, which gives you more fine-grained
342
+            control over your timeouts.
343
+        """
344
+        self.num_requests += 1
345
+
346
+        timeout_obj = self._get_timeout(timeout)
347
+        timeout_obj.start_connect()
348
+        conn.timeout = timeout_obj.connect_timeout
349
+
350
+        # Trigger any extra validation we need to do.
351
+        try:
352
+            self._validate_conn(conn)
353
+        except (SocketTimeout, BaseSSLError) as e:
354
+            # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout.
355
+            self._raise_timeout(err=e, url=url, timeout_value=conn.timeout)
356
+            raise
357
+
358
+        # conn.request() calls httplib.*.request, not the method in
359
+        # urllib3.request. It also calls makefile (recv) on the socket.
360
+        if chunked:
361
+            conn.request_chunked(method, url, **httplib_request_kw)
362
+        else:
363
+            conn.request(method, url, **httplib_request_kw)
364
+
365
+        # Reset the timeout for the recv() on the socket
366
+        read_timeout = timeout_obj.read_timeout
367
+
368
+        # App Engine doesn't have a sock attr
369
+        if getattr(conn, 'sock', None):
370
+            # In Python 3 socket.py will catch EAGAIN and return None when you
371
+            # try and read into the file pointer created by http.client, which
372
+            # instead raises a BadStatusLine exception. Instead of catching
373
+            # the exception and assuming all BadStatusLine exceptions are read
374
+            # timeouts, check for a zero timeout before making the request.
375
+            if read_timeout == 0:
376
+                raise ReadTimeoutError(
377
+                    self, url, "Read timed out. (read timeout=%s)" % read_timeout)
378
+            if read_timeout is Timeout.DEFAULT_TIMEOUT:
379
+                conn.sock.settimeout(socket.getdefaulttimeout())
380
+            else:  # None or a value
381
+                conn.sock.settimeout(read_timeout)
382
+
383
+        # Receive the response from the server
384
+        try:
385
+            try:  # Python 2.7, use buffering of HTTP responses
386
+                httplib_response = conn.getresponse(buffering=True)
387
+            except TypeError:  # Python 2.6 and older, Python 3
388
+                try:
389
+                    httplib_response = conn.getresponse()
390
+                except Exception as e:
391
+                    # Remove the TypeError from the exception chain in Python 3;
392
+                    # otherwise it looks like a programming error was the cause.
393
+                    six.raise_from(e, None)
394
+        except (SocketTimeout, BaseSSLError, SocketError) as e:
395
+            self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
396
+            raise
397
+
398
+        # AppEngine doesn't have a version attr.
399
+        http_version = getattr(conn, '_http_vsn_str', 'HTTP/?')
400
+        log.debug("\"%s %s %s\" %s %s", method, url, http_version,
401
+                  httplib_response.status, httplib_response.length)
402
+
403
+        try:
404
+            assert_header_parsing(httplib_response.msg)
405
+        except HeaderParsingError as hpe:  # Platform-specific: Python 3
406
+            log.warning(
407
+                'Failed to parse headers (url=%s): %s',
408
+                self._absolute_url(url), hpe, exc_info=True)
409
+
410
+        return httplib_response
411
+
412
+    def _absolute_url(self, path):
413
+        return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url
414
+
415
+    def close(self):
416
+        """
417
+        Close all pooled connections and disable the pool.
418
+        """
419
+        # Disable access to the pool
420
+        old_pool, self.pool = self.pool, None
421
+
422
+        try:
423
+            while True:
424
+                conn = old_pool.get(block=False)
425
+                if conn:
426
+                    conn.close()
427
+
428
+        except Empty:
429
+            pass  # Done.
430
+
431
+    def is_same_host(self, url):
432
+        """
433
+        Check if the given ``url`` is a member of the same host as this
434
+        connection pool.
435
+        """
436
+        if url.startswith('/'):
437
+            return True
438
+
439
+        # TODO: Add optional support for socket.gethostbyname checking.
440
+        scheme, host, port = get_host(url)
441
+
442
+        # Use explicit default port for comparison when none is given
443
+        if self.port and not port:
444
+            port = port_by_scheme.get(scheme)
445
+        elif not self.port and port == port_by_scheme.get(scheme):
446
+            port = None
447
+
448
+        return (scheme, host, port) == (self.scheme, self.host, self.port)
449
+
450
+    def urlopen(self, method, url, body=None, headers=None, retries=None,
451
+                redirect=True, assert_same_host=True, timeout=_Default,
452
+                pool_timeout=None, release_conn=None, chunked=False,
453
+                **response_kw):
454
+        """
455
+        Get a connection from the pool and perform an HTTP request. This is the
456
+        lowest level call for making a request, so you'll need to specify all
457
+        the raw details.
458
+
459
+        .. note::
460
+
461
+           More commonly, it's appropriate to use a convenience method provided
462
+           by :class:`.RequestMethods`, such as :meth:`request`.
463
+
464
+        .. note::
465
+
466
+           `release_conn` will only behave as expected if
467
+           `preload_content=False` because we want to make
468
+           `preload_content=False` the default behaviour someday soon without
469
+           breaking backwards compatibility.
470
+
471
+        :param method:
472
+            HTTP request method (such as GET, POST, PUT, etc.)
473
+
474
+        :param body:
475
+            Data to send in the request body (useful for creating
476
+            POST requests, see HTTPConnectionPool.post_url for
477
+            more convenience).
478
+
479
+        :param headers:
480
+            Dictionary of custom headers to send, such as User-Agent,
481
+            If-None-Match, etc. If None, pool headers are used. If provided,
482
+            these headers completely replace any pool-specific headers.
483
+
484
+        :param retries:
485
+            Configure the number of retries to allow before raising a
486
+            :class:`~urllib3.exceptions.MaxRetryError` exception.
487
+
488
+            Pass ``None`` to retry until you receive a response. Pass a
489
+            :class:`~urllib3.util.retry.Retry` object for fine-grained control
490
+            over different types of retries.
491
+            Pass an integer number to retry connection errors that many times,
492
+            but no other types of errors. Pass zero to never retry.
493
+
494
+            If ``False``, then retries are disabled and any exception is raised
495
+            immediately. Also, instead of raising a MaxRetryError on redirects,
496
+            the redirect response will be returned.
497
+
498
+        :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
499
+
500
+        :param redirect:
501
+            If True, automatically handle redirects (status codes 301, 302,
502
+            303, 307, 308). Each redirect counts as a retry. Disabling retries
503
+            will disable redirect, too.
504
+
505
+        :param assert_same_host:
506
+            If ``True``, will make sure that the host of the pool requests is
507
+            consistent else will raise HostChangedError. When False, you can
508
+            use the pool on an HTTP proxy and request foreign hosts.
509
+
510
+        :param timeout:
511
+            If specified, overrides the default timeout for this one
512
+            request. It may be a float (in seconds) or an instance of
513
+            :class:`urllib3.util.Timeout`.
514
+
515
+        :param pool_timeout:
516
+            If set and the pool is set to block=True, then this method will
517
+            block for ``pool_timeout`` seconds and raise EmptyPoolError if no
518
+            connection is available within the time period.
519
+
520
+        :param release_conn:
521
+            If False, then the urlopen call will not release the connection
522
+            back into the pool once a response is received (but will release if
523
+            you read the entire contents of the response such as when
524
+            `preload_content=True`). This is useful if you're not preloading
525
+            the response's content immediately. You will need to call
526
+            ``r.release_conn()`` on the response ``r`` to return the connection
527
+            back into the pool. If None, it takes the value of
528
+            ``response_kw.get('preload_content', True)``.
529
+
530
+        :param chunked:
531
+            If True, urllib3 will send the body using chunked transfer
532
+            encoding. Otherwise, urllib3 will send the body using the standard
533
+            content-length form. Defaults to False.
534
+
535
+        :param \**response_kw:
536
+            Additional parameters are passed to
537
+            :meth:`urllib3.response.HTTPResponse.from_httplib`
538
+        """
539
+        if headers is None:
540
+            headers = self.headers
541
+
542
+        if not isinstance(retries, Retry):
543
+            retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
544
+
545
+        if release_conn is None:
546
+            release_conn = response_kw.get('preload_content', True)
547
+
548
+        # Check host
549
+        if assert_same_host and not self.is_same_host(url):
550
+            raise HostChangedError(self, url, retries)
551
+
552
+        conn = None
553
+
554
+        # Track whether `conn` needs to be released before
555
+        # returning/raising/recursing. Update this variable if necessary, and
556
+        # leave `release_conn` constant throughout the function. That way, if
557
+        # the function recurses, the original value of `release_conn` will be
558
+        # passed down into the recursive call, and its value will be respected.
559
+        #
560
+        # See issue #651 [1] for details.
561
+        #
562
+        # [1] <https://github.com/shazow/urllib3/issues/651>
563
+        release_this_conn = release_conn
564
+
565
+        # Merge the proxy headers. Only do this in HTTP. We have to copy the
566
+        # headers dict so we can safely change it without those changes being
567
+        # reflected in anyone else's copy.
568
+        if self.scheme == 'http':
569
+            headers = headers.copy()
570
+            headers.update(self.proxy_headers)
571
+
572
+        # Must keep the exception bound to a separate variable or else Python 3
573
+        # complains about UnboundLocalError.
574
+        err = None
575
+
576
+        # Keep track of whether we cleanly exited the except block. This
577
+        # ensures we do proper cleanup in finally.
578
+        clean_exit = False
579
+
580
+        try:
581
+            # Request a connection from the queue.
582
+            timeout_obj = self._get_timeout(timeout)
583
+            conn = self._get_conn(timeout=pool_timeout)
584
+
585
+            conn.timeout = timeout_obj.connect_timeout
586
+
587
+            is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None)
588
+            if is_new_proxy_conn:
589
+                self._prepare_proxy(conn)
590
+
591
+            # Make the request on the httplib connection object.
592
+            httplib_response = self._make_request(conn, method, url,
593
+                                                  timeout=timeout_obj,
594
+                                                  body=body, headers=headers,
595
+                                                  chunked=chunked)
596
+
597
+            # If we're going to release the connection in ``finally:``, then
598
+            # the response doesn't need to know about the connection. Otherwise
599
+            # it will also try to release it and we'll have a double-release
600
+            # mess.
601
+            response_conn = conn if not release_conn else None
602
+
603
+            # Import httplib's response into our own wrapper object
604
+            response = self.ResponseCls.from_httplib(httplib_response,
605
+                                                     pool=self,
606
+                                                     connection=response_conn,
607
+                                                     **response_kw)
608
+
609
+            # Everything went great!
610
+            clean_exit = True
611
+
612
+        except Empty:
613
+            # Timed out by queue.
614
+            raise EmptyPoolError(self, "No pool connections are available.")
615
+
616
+        except (BaseSSLError, CertificateError) as e:
617
+            # Close the connection. If a connection is reused on which there
618
+            # was a Certificate error, the next request will certainly raise
619
+            # another Certificate error.
620
+            clean_exit = False
621
+            raise SSLError(e)
622
+
623
+        except SSLError:
624
+            # Treat SSLError separately from BaseSSLError to preserve
625
+            # traceback.
626
+            clean_exit = False
627
+            raise
628
+
629
+        except (TimeoutError, HTTPException, SocketError, ProtocolError) as e:
630
+            # Discard the connection for these exceptions. It will be
631
+            # be replaced during the next _get_conn() call.
632
+            clean_exit = False
633
+
634
+            if isinstance(e, (SocketError, NewConnectionError)) and self.proxy:
635
+                e = ProxyError('Cannot connect to proxy.', e)
636
+            elif isinstance(e, (SocketError, HTTPException)):
637
+                e = ProtocolError('Connection aborted.', e)
638
+
639
+            retries = retries.increment(method, url, error=e, _pool=self,
640
+                                        _stacktrace=sys.exc_info()[2])
641
+            retries.sleep()
642
+
643
+            # Keep track of the error for the retry warning.
644
+            err = e
645
+
646
+        finally:
647
+            if not clean_exit:
648
+                # We hit some kind of exception, handled or otherwise. We need
649
+                # to throw the connection away unless explicitly told not to.
650
+                # Close the connection, set the variable to None, and make sure
651
+                # we put the None back in the pool to avoid leaking it.
652
+                conn = conn and conn.close()
653
+                release_this_conn = True
654
+
655
+            if release_this_conn:
656
+                # Put the connection back to be reused. If the connection is
657
+                # expired then it will be None, which will get replaced with a
658
+                # fresh connection during _get_conn.
659
+                self._put_conn(conn)
660
+
661
+        if not conn:
662
+            # Try again
663
+            log.warning("Retrying (%r) after connection "
664
+                        "broken by '%r': %s", retries, err, url)
665
+            return self.urlopen(method, url, body, headers, retries,
666
+                                redirect, assert_same_host,
667
+                                timeout=timeout, pool_timeout=pool_timeout,
668
+                                release_conn=release_conn, **response_kw)
669
+
670
+        # Handle redirect?
671
+        redirect_location = redirect and response.get_redirect_location()
672
+        if redirect_location:
673
+            if response.status == 303:
674
+                method = 'GET'
675
+
676
+            try:
677
+                retries = retries.increment(method, url, response=response, _pool=self)
678
+            except MaxRetryError:
679
+                if retries.raise_on_redirect:
680
+                    # Release the connection for this response, since we're not
681
+                    # returning it to be released manually.
682
+                    response.release_conn()
683
+                    raise
684
+                return response
685
+
686
+            log.info("Redirecting %s -> %s", url, redirect_location)
687
+            return self.urlopen(
688
+                method, redirect_location, body, headers,
689
+                retries=retries, redirect=redirect,
690
+                assert_same_host=assert_same_host,
691
+                timeout=timeout, pool_timeout=pool_timeout,
692
+                release_conn=release_conn, **response_kw)
693
+
694
+        # Check if we should retry the HTTP response.
695
+        if retries.is_forced_retry(method, status_code=response.status):
696
+            try:
697
+                retries = retries.increment(method, url, response=response, _pool=self)
698
+            except MaxRetryError:
699
+                if retries.raise_on_status:
700
+                    # Release the connection for this response, since we're not
701
+                    # returning it to be released manually.
702
+                    response.release_conn()
703
+                    raise
704
+                return response
705
+            retries.sleep()
706
+            log.info("Forced retry: %s", url)
707
+            return self.urlopen(
708
+                method, url, body, headers,
709
+                retries=retries, redirect=redirect,
710
+                assert_same_host=assert_same_host,
711
+                timeout=timeout, pool_timeout=pool_timeout,
712
+                release_conn=release_conn, **response_kw)
713
+
714
+        return response
715
+
716
+
717
+class HTTPSConnectionPool(HTTPConnectionPool):
718
+    """
719
+    Same as :class:`.HTTPConnectionPool`, but HTTPS.
720
+
721
+    When Python is compiled with the :mod:`ssl` module, then
722
+    :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates,
723
+    instead of :class:`.HTTPSConnection`.
724
+
725
+    :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``,
726
+    ``assert_hostname`` and ``host`` in this order to verify connections.
727
+    If ``assert_hostname`` is False, no verification is done.
728
+
729
+    The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``,
730
+    ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is
731
+    available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade
732
+    the connection socket into an SSL socket.
733
+    """
734
+
735
+    scheme = 'https'
736
+    ConnectionCls = HTTPSConnection
737
+
738
+    def __init__(self, host, port=None,
739
+                 strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1,
740
+                 block=False, headers=None, retries=None,
741
+                 _proxy=None, _proxy_headers=None,
742
+                 key_file=None, cert_file=None, cert_reqs=None,
743
+                 ca_certs=None, ssl_version=None,
744
+                 assert_hostname=None, assert_fingerprint=None,
745
+                 ca_cert_dir=None, **conn_kw):
746
+
747
+        HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize,
748
+                                    block, headers, retries, _proxy, _proxy_headers,
749
+                                    **conn_kw)
750
+
751
+        if ca_certs and cert_reqs is None:
752
+            cert_reqs = 'CERT_REQUIRED'
753
+
754
+        self.key_file = key_file
755
+        self.cert_file = cert_file
756
+        self.cert_reqs = cert_reqs
757
+        self.ca_certs = ca_certs
758
+        self.ca_cert_dir = ca_cert_dir
759
+        self.ssl_version = ssl_version
760
+        self.assert_hostname = assert_hostname
761
+        self.assert_fingerprint = assert_fingerprint
762
+
763
+    def _prepare_conn(self, conn):
764
+        """
765
+        Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket`
766
+        and establish the tunnel if proxy is used.
767
+        """
768
+
769
+        if isinstance(conn, VerifiedHTTPSConnection):
770
+            conn.set_cert(key_file=self.key_file,
771
+                          cert_file=self.cert_file,
772
+                          cert_reqs=self.cert_reqs,
773
+                          ca_certs=self.ca_certs,
774
+                          ca_cert_dir=self.ca_cert_dir,
775
+                          assert_hostname=self.assert_hostname,
776
+                          assert_fingerprint=self.assert_fingerprint)
777
+            conn.ssl_version = self.ssl_version
778
+
779
+        return conn
780
+
781
+    def _prepare_proxy(self, conn):
782
+        """
783
+        Establish tunnel connection early, because otherwise httplib
784
+        would improperly set Host: header to proxy's IP:port.
785
+        """
786
+        # Python 2.7+
787
+        try:
788
+            set_tunnel = conn.set_tunnel
789
+        except AttributeError:  # Platform-specific: Python 2.6
790
+            set_tunnel = conn._set_tunnel
791
+
792
+        if sys.version_info <= (2, 6, 4) and not self.proxy_headers:  # Python 2.6.4 and older
793
+            set_tunnel(self.host, self.port)
794
+        else:
795
+            set_tunnel(self.host, self.port, self.proxy_headers)
796
+
797
+        conn.connect()
798
+
799
+    def _new_conn(self):
800
+        """
801
+        Return a fresh :class:`httplib.HTTPSConnection`.
802
+        """
803
+        self.num_connections += 1
804
+        log.info("Starting new HTTPS connection (%d): %s",
805
+                 self.num_connections, self.host)
806
+
807
+        if not self.ConnectionCls or self.ConnectionCls is DummyConnection:
808
+            raise SSLError("Can't connect to HTTPS URL because the SSL "
809
+                           "module is not available.")
810
+
811
+        actual_host = self.host
812
+        actual_port = self.port
813
+        if self.proxy is not None:
814
+            actual_host = self.proxy.host
815
+            actual_port = self.proxy.port
816
+
817
+        conn = self.ConnectionCls(host=actual_host, port=actual_port,
818
+                                  timeout=self.timeout.connect_timeout,
819
+                                  strict=self.strict, **self.conn_kw)
820
+
821
+        return self._prepare_conn(conn)
822
+
823
+    def _validate_conn(self, conn):
824
+        """
825
+        Called right before a request is made, after the socket is created.
826
+        """
827
+        super(HTTPSConnectionPool, self)._validate_conn(conn)
828
+
829
+        # Force connect early to allow us to validate the connection.
830
+        if not getattr(conn, 'sock', None):  # AppEngine might not have  `.sock`
831
+            conn.connect()
832
+
833
+        if not conn.is_verified:
834
+            warnings.warn((
835
+                'Unverified HTTPS request is being made. '
836
+                'Adding certificate verification is strongly advised. See: '
837
+                'https://urllib3.readthedocs.io/en/latest/security.html'),
838
+                InsecureRequestWarning)
839
+
840
+
841
+def connection_from_url(url, **kw):
842
+    """
843
+    Given a url, return an :class:`.ConnectionPool` instance of its host.
844
+
845
+    This is a shortcut for not having to parse out the scheme, host, and port
846
+    of the url before creating an :class:`.ConnectionPool` instance.
847
+
848
+    :param url:
849
+        Absolute URL string that must include the scheme. Port is optional.
850
+
851
+    :param \**kw:
852
+        Passes additional parameters to the constructor of the appropriate
853
+        :class:`.ConnectionPool`. Useful for specifying things like
854
+        timeout, maxsize, headers, etc.
855
+
856
+    Example::
857
+
858
+        >>> conn = connection_from_url('http://google.com/')
859
+        >>> r = conn.request('GET', '/')
860
+    """
861
+    scheme, host, port = get_host(url)
862
+    port = port or port_by_scheme.get(scheme, 80)
863
+    if scheme == 'https':
864
+        return HTTPSConnectionPool(host, port=port, **kw)
865
+    else:
866
+        return HTTPConnectionPool(host, port=port, **kw)

+ 0
- 0
Contents/Libraries/Shared/requests/packages/urllib3/contrib/__init__.py View File


+ 231
- 0
Contents/Libraries/Shared/requests/packages/urllib3/contrib/appengine.py View File

1
+from __future__ import absolute_import
2
+import logging
3
+import os
4
+import warnings
5
+
6
+from ..exceptions import (
7
+    HTTPError,
8
+    HTTPWarning,
9
+    MaxRetryError,
10
+    ProtocolError,
11
+    TimeoutError,
12
+    SSLError
13
+)
14
+
15
+from ..packages.six import BytesIO
16
+from ..request import RequestMethods
17
+from ..response import HTTPResponse
18
+from ..util.timeout import Timeout
19
+from ..util.retry import Retry
20
+
21
+try:
22
+    from google.appengine.api import urlfetch
23
+except ImportError:
24
+    urlfetch = None
25
+
26
+
27
+log = logging.getLogger(__name__)
28
+
29
+
30
+class AppEnginePlatformWarning(HTTPWarning):
31
+    pass
32
+
33
+
34
+class AppEnginePlatformError(HTTPError):
35
+    pass
36
+
37
+
38
+class AppEngineManager(RequestMethods):
39
+    """
40
+    Connection manager for Google App Engine sandbox applications.
41
+
42
+    This manager uses the URLFetch service directly instead of using the
43
+    emulated httplib, and is subject to URLFetch limitations as described in
44
+    the App Engine documentation here:
45
+
46
+        https://cloud.google.com/appengine/docs/python/urlfetch
47
+
48
+    Notably it will raise an AppEnginePlatformError if:
49
+        * URLFetch is not available.
50
+        * If you attempt to use this on GAEv2 (Managed VMs), as full socket
51
+          support is available.
52
+        * If a request size is more than 10 megabytes.
53
+        * If a response size is more than 32 megabtyes.
54
+        * If you use an unsupported request method such as OPTIONS.
55
+
56
+    Beyond those cases, it will raise normal urllib3 errors.
57
+    """
58
+
59
+    def __init__(self, headers=None, retries=None, validate_certificate=True):
60
+        if not urlfetch:
61
+            raise AppEnginePlatformError(
62
+                "URLFetch is not available in this environment.")
63
+
64
+        if is_prod_appengine_mvms():
65
+            raise AppEnginePlatformError(
66
+                "Use normal urllib3.PoolManager instead of AppEngineManager"
67
+                "on Managed VMs, as using URLFetch is not necessary in "
68
+                "this environment.")
69
+
70
+        warnings.warn(
71
+            "urllib3 is using URLFetch on Google App Engine sandbox instead "
72
+            "of sockets. To use sockets directly instead of URLFetch see "
73
+            "https://urllib3.readthedocs.io/en/latest/contrib.html.",
74
+            AppEnginePlatformWarning)
75
+
76
+        RequestMethods.__init__(self, headers)
77
+        self.validate_certificate = validate_certificate
78
+
79
+        self.retries = retries or Retry.DEFAULT
80
+
81
+    def __enter__(self):
82
+        return self
83
+
84
+    def __exit__(self, exc_type, exc_val, exc_tb):
85
+        # Return False to re-raise any potential exceptions
86
+        return False
87
+
88
+    def urlopen(self, method, url, body=None, headers=None,
89
+                retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT,
90
+                **response_kw):
91
+
92
+        retries = self._get_retries(retries, redirect)
93
+
94
+        try:
95
+            response = urlfetch.fetch(
96
+                url,
97
+                payload=body,
98
+                method=method,
99
+                headers=headers or {},
100
+                allow_truncated=False,
101
+                follow_redirects=(
102
+                    redirect and
103
+                    retries.redirect != 0 and
104
+                    retries.total),
105
+                deadline=self._get_absolute_timeout(timeout),
106
+                validate_certificate=self.validate_certificate,
107
+            )
108
+        except urlfetch.DeadlineExceededError as e:
109
+            raise TimeoutError(self, e)
110
+
111
+        except urlfetch.InvalidURLError as e:
112
+            if 'too large' in str(e):
113
+                raise AppEnginePlatformError(
114
+                    "URLFetch request too large, URLFetch only "
115
+                    "supports requests up to 10mb in size.", e)
116
+            raise ProtocolError(e)
117
+
118
+        except urlfetch.DownloadError as e:
119
+            if 'Too many redirects' in str(e):
120
+                raise MaxRetryError(self, url, reason=e)
121
+            raise ProtocolError(e)
122
+
123
+        except urlfetch.ResponseTooLargeError as e:
124
+            raise AppEnginePlatformError(
125
+                "URLFetch response too large, URLFetch only supports"
126
+                "responses up to 32mb in size.", e)
127
+
128
+        except urlfetch.SSLCertificateError as e:
129
+            raise SSLError(e)
130
+
131
+        except urlfetch.InvalidMethodError as e:
132
+            raise AppEnginePlatformError(
133
+                "URLFetch does not support method: %s" % method, e)
134
+
135
+        http_response = self._urlfetch_response_to_http_response(
136
+            response, **response_kw)
137
+
138
+        # Check for redirect response
139
+        if (http_response.get_redirect_location() and
140
+                retries.raise_on_redirect and redirect):
141
+            raise MaxRetryError(self, url, "too many redirects")
142
+
143
+        # Check if we should retry the HTTP response.
144
+        if retries.is_forced_retry(method, status_code=http_response.status):
145
+            retries = retries.increment(
146
+                method, url, response=http_response, _pool=self)
147
+            log.info("Forced retry: %s", url)
148
+            retries.sleep()
149
+            return self.urlopen(
150
+                method, url,
151
+                body=body, headers=headers,
152
+                retries=retries, redirect=redirect,
153
+                timeout=timeout, **response_kw)
154
+
155
+        return http_response
156
+
157
+    def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw):
158
+
159
+        if is_prod_appengine():
160
+            # Production GAE handles deflate encoding automatically, but does
161
+            # not remove the encoding header.
162
+            content_encoding = urlfetch_resp.headers.get('content-encoding')
163
+
164
+            if content_encoding == 'deflate':
165
+                del urlfetch_resp.headers['content-encoding']
166
+
167
+        transfer_encoding = urlfetch_resp.headers.get('transfer-encoding')
168
+        # We have a full response's content,
169
+        # so let's make sure we don't report ourselves as chunked data.
170
+        if transfer_encoding == 'chunked':
171
+            encodings = transfer_encoding.split(",")
172
+            encodings.remove('chunked')
173
+            urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings)
174
+
175
+        return HTTPResponse(
176
+            # In order for decoding to work, we must present the content as
177
+            # a file-like object.
178
+            body=BytesIO(urlfetch_resp.content),
179
+            headers=urlfetch_resp.headers,
180
+            status=urlfetch_resp.status_code,
181
+            **response_kw
182
+        )
183
+
184
+    def _get_absolute_timeout(self, timeout):
185
+        if timeout is Timeout.DEFAULT_TIMEOUT:
186
+            return 5  # 5s is the default timeout for URLFetch.
187
+        if isinstance(timeout, Timeout):
188
+            if timeout._read is not timeout._connect:
189
+                warnings.warn(
190
+                    "URLFetch does not support granular timeout settings, "
191
+                    "reverting to total timeout.", AppEnginePlatformWarning)
192
+            return timeout.total
193
+        return timeout
194
+
195
+    def _get_retries(self, retries, redirect):
196
+        if not isinstance(retries, Retry):
197
+            retries = Retry.from_int(
198
+                retries, redirect=redirect, default=self.retries)
199
+
200
+        if retries.connect or retries.read or retries.redirect:
201
+            warnings.warn(
202
+                "URLFetch only supports total retries and does not "
203
+                "recognize connect, read, or redirect retry parameters.",
204
+                AppEnginePlatformWarning)
205
+
206
+        return retries
207
+
208
+
209
+def is_appengine():
210
+    return (is_local_appengine() or
211
+            is_prod_appengine() or
212
+            is_prod_appengine_mvms())
213
+
214
+
215
+def is_appengine_sandbox():
216
+    return is_appengine() and not is_prod_appengine_mvms()
217
+
218
+
219
+def is_local_appengine():
220
+    return ('APPENGINE_RUNTIME' in os.environ and
221
+            'Development/' in os.environ['SERVER_SOFTWARE'])
222
+
223
+
224
+def is_prod_appengine():
225
+    return ('APPENGINE_RUNTIME' in os.environ and
226
+            'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and
227
+            not is_prod_appengine_mvms())
228
+
229
+
230
+def is_prod_appengine_mvms():
231
+    return os.environ.get('GAE_VM', False) == 'true'

+ 115
- 0
Contents/Libraries/Shared/requests/packages/urllib3/contrib/ntlmpool.py View File

1
+"""
2
+NTLM authenticating pool, contributed by erikcederstran
3
+
4
+Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10
5
+"""
6
+from __future__ import absolute_import
7
+
8
+try:
9
+    from http.client import HTTPSConnection
10
+except ImportError:
11
+    from httplib import HTTPSConnection
12
+from logging import getLogger
13
+from ntlm import ntlm
14
+
15
+from urllib3 import HTTPSConnectionPool
16
+
17
+
18
+log = getLogger(__name__)
19
+
20
+
21
+class NTLMConnectionPool(HTTPSConnectionPool):
22
+    """
23
+    Implements an NTLM authentication version of an urllib3 connection pool
24
+    """
25
+
26
+    scheme = 'https'
27
+
28
+    def __init__(self, user, pw, authurl, *args, **kwargs):
29
+        """
30
+        authurl is a random URL on the server that is protected by NTLM.
31
+        user is the Windows user, probably in the DOMAIN\\username format.
32
+        pw is the password for the user.
33
+        """
34
+        super(NTLMConnectionPool, self).__init__(*args, **kwargs)
35
+        self.authurl = authurl
36
+        self.rawuser = user
37
+        user_parts = user.split('\\', 1)
38
+        self.domain = user_parts[0].upper()
39
+        self.user = user_parts[1]
40
+        self.pw = pw
41
+
42
+    def _new_conn(self):
43
+        # Performs the NTLM handshake that secures the connection. The socket
44
+        # must be kept open while requests are performed.
45
+        self.num_connections += 1
46
+        log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s',
47
+                  self.num_connections, self.host, self.authurl)
48
+
49
+        headers = {}
50
+        headers['Connection'] = 'Keep-Alive'
51
+        req_header = 'Authorization'
52
+        resp_header = 'www-authenticate'
53
+
54
+        conn = HTTPSConnection(host=self.host, port=self.port)
55
+
56
+        # Send negotiation message
57
+        headers[req_header] = (
58
+            'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser))
59
+        log.debug('Request headers: %s', headers)
60
+        conn.request('GET', self.authurl, None, headers)
61
+        res = conn.getresponse()
62
+        reshdr = dict(res.getheaders())
63
+        log.debug('Response status: %s %s', res.status, res.reason)
64
+        log.debug('Response headers: %s', reshdr)
65
+        log.debug('Response data: %s [...]', res.read(100))
66
+
67
+        # Remove the reference to the socket, so that it can not be closed by
68
+        # the response object (we want to keep the socket open)
69
+        res.fp = None
70
+
71
+        # Server should respond with a challenge message
72
+        auth_header_values = reshdr[resp_header].split(', ')
73
+        auth_header_value = None
74
+        for s in auth_header_values:
75
+            if s[:5] == 'NTLM ':
76
+                auth_header_value = s[5:]
77
+        if auth_header_value is None:
78
+            raise Exception('Unexpected %s response header: %s' %
79
+                            (resp_header, reshdr[resp_header]))
80
+
81
+        # Send authentication message
82
+        ServerChallenge, NegotiateFlags = \
83
+            ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value)
84
+        auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge,
85
+                                                         self.user,
86
+                                                         self.domain,
87
+                                                         self.pw,
88
+                                                         NegotiateFlags)
89
+        headers[req_header] = 'NTLM %s' % auth_msg
90
+        log.debug('Request headers: %s', headers)
91
+        conn.request('GET', self.authurl, None, headers)
92
+        res = conn.getresponse()
93
+        log.debug('Response status: %s %s', res.status, res.reason)
94
+        log.debug('Response headers: %s', dict(res.getheaders()))
95
+        log.debug('Response data: %s [...]', res.read()[:100])
96
+        if res.status != 200:
97
+            if res.status == 401:
98
+                raise Exception('Server rejected request: wrong '
99
+                                'username or password')
100
+            raise Exception('Wrong server response: %s %s' %
101
+                            (res.status, res.reason))
102
+
103
+        res.fp = None
104
+        log.debug('Connection established')
105
+        return conn
106
+
107
+    def urlopen(self, method, url, body=None, headers=None, retries=3,
108
+                redirect=True, assert_same_host=True):
109
+        if headers is None:
110
+            headers = {}
111
+        headers['Connection'] = 'Keep-Alive'
112
+        return super(NTLMConnectionPool, self).urlopen(method, url, body,
113
+                                                       headers, retries,
114
+                                                       redirect,
115
+                                                       assert_same_host)

+ 358
- 0
Contents/Libraries/Shared/requests/packages/urllib3/contrib/pyopenssl.py View File

1
+'''SSL with SNI_-support for Python 2. Follow these instructions if you would
2
+like to verify SSL certificates in Python 2. Note, the default libraries do
3
+*not* do certificate checking; you need to do additional work to validate
4
+certificates yourself.
5
+
6
+This needs the following packages installed:
7
+
8
+* pyOpenSSL (tested with 0.13)
9
+* ndg-httpsclient (tested with 0.3.2)
10
+* pyasn1 (tested with 0.1.6)
11
+
12
+You can install them with the following command:
13
+
14
+    pip install pyopenssl ndg-httpsclient pyasn1
15
+
16
+To activate certificate checking, call
17
+:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code
18
+before you begin making HTTP requests. This can be done in a ``sitecustomize``
19
+module, or at any other time before your application begins using ``urllib3``,
20
+like this::
21
+
22
+    try:
23
+        import urllib3.contrib.pyopenssl
24
+        urllib3.contrib.pyopenssl.inject_into_urllib3()
25
+    except ImportError:
26
+        pass
27
+
28
+Now you can use :mod:`urllib3` as you normally would, and it will support SNI
29
+when the required modules are installed.
30
+
31
+Activating this module also has the positive side effect of disabling SSL/TLS
32
+compression in Python 2 (see `CRIME attack`_).
33
+
34
+If you want to configure the default list of supported cipher suites, you can
35
+set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable.
36
+
37
+Module Variables
38
+----------------
39
+
40
+:var DEFAULT_SSL_CIPHER_LIST: The list of supported SSL/TLS cipher suites.
41
+
42
+.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication
43
+.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit)
44
+
45
+'''
46
+from __future__ import absolute_import
47
+
48
+try:
49
+    from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT
50
+    from ndg.httpsclient.subj_alt_name import SubjectAltName as BaseSubjectAltName
51
+except SyntaxError as e:
52
+    raise ImportError(e)
53
+
54
+import OpenSSL.SSL
55
+from pyasn1.codec.der import decoder as der_decoder
56
+from pyasn1.type import univ, constraint
57
+from socket import timeout, error as SocketError
58
+
59
+try:  # Platform-specific: Python 2
60
+    from socket import _fileobject
61
+except ImportError:  # Platform-specific: Python 3
62
+    _fileobject = None
63
+    from urllib3.packages.backports.makefile import backport_makefile
64
+
65
+import ssl
66
+import select
67
+import six
68
+
69
+from .. import connection
70
+from .. import util
71
+
72
+__all__ = ['inject_into_urllib3', 'extract_from_urllib3']
73
+
74
+# SNI only *really* works if we can read the subjectAltName of certificates.
75
+HAS_SNI = SUBJ_ALT_NAME_SUPPORT
76
+
77
+# Map from urllib3 to PyOpenSSL compatible parameter-values.
78
+_openssl_versions = {
79
+    ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD,
80
+    ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD,
81
+}
82
+
83
+if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'):
84
+    _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD
85
+
86
+if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'):
87
+    _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD
88
+
89
+try:
90
+    _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD})
91
+except AttributeError:
92
+    pass
93
+
94
+_openssl_verify = {
95
+    ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE,
96
+    ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER,
97
+    ssl.CERT_REQUIRED:
98
+        OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
99
+}
100
+
101
+DEFAULT_SSL_CIPHER_LIST = util.ssl_.DEFAULT_CIPHERS.encode('ascii')
102
+
103
+# OpenSSL will only write 16K at a time
104
+SSL_WRITE_BLOCKSIZE = 16384
105
+
106
+orig_util_HAS_SNI = util.HAS_SNI
107
+orig_connection_ssl_wrap_socket = connection.ssl_wrap_socket
108
+
109
+
110
+def inject_into_urllib3():
111
+    'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.'
112
+
113
+    connection.ssl_wrap_socket = ssl_wrap_socket
114
+    util.HAS_SNI = HAS_SNI
115
+    util.IS_PYOPENSSL = True
116
+
117
+
118
+def extract_from_urllib3():
119
+    'Undo monkey-patching by :func:`inject_into_urllib3`.'
120
+
121
+    connection.ssl_wrap_socket = orig_connection_ssl_wrap_socket
122
+    util.HAS_SNI = orig_util_HAS_SNI
123
+    util.IS_PYOPENSSL = False
124
+
125
+
126
+# Note: This is a slightly bug-fixed version of same from ndg-httpsclient.
127
+class SubjectAltName(BaseSubjectAltName):
128
+    '''ASN.1 implementation for subjectAltNames support'''
129
+
130
+    # There is no limit to how many SAN certificates a certificate may have,
131
+    #   however this needs to have some limit so we'll set an arbitrarily high
132
+    #   limit.
133
+    sizeSpec = univ.SequenceOf.sizeSpec + \
134
+        constraint.ValueSizeConstraint(1, 1024)
135
+
136
+
137
+# Note: This is a slightly bug-fixed version of same from ndg-httpsclient.
138
+def get_subj_alt_name(peer_cert):
139
+    # Search through extensions
140
+    dns_name = []
141
+    if not SUBJ_ALT_NAME_SUPPORT:
142
+        return dns_name
143
+
144
+    general_names = SubjectAltName()
145
+    for i in range(peer_cert.get_extension_count()):
146
+        ext = peer_cert.get_extension(i)
147
+        ext_name = ext.get_short_name()
148
+        if ext_name != b'subjectAltName':
149
+            continue
150
+
151
+        # PyOpenSSL returns extension data in ASN.1 encoded form
152
+        ext_dat = ext.get_data()
153
+        decoded_dat = der_decoder.decode(ext_dat,
154
+                                         asn1Spec=general_names)
155
+
156
+        for name in decoded_dat:
157
+            if not isinstance(name, SubjectAltName):
158
+                continue
159
+            for entry in range(len(name)):
160
+                component = name.getComponentByPosition(entry)
161
+                if component.getName() != 'dNSName':
162
+                    continue
163
+                dns_name.append(str(component.getComponent()))
164
+
165
+    return dns_name
166
+
167
+
168
+class WrappedSocket(object):
169
+    '''API-compatibility wrapper for Python OpenSSL's Connection-class.
170
+
171
+    Note: _makefile_refs, _drop() and _reuse() are needed for the garbage
172
+    collector of pypy.
173
+    '''
174
+
175
+    def __init__(self, connection, socket, suppress_ragged_eofs=True):
176
+        self.connection = connection
177
+        self.socket = socket
178
+        self.suppress_ragged_eofs = suppress_ragged_eofs
179
+        self._makefile_refs = 0
180
+        self._closed = False
181
+
182
+    def fileno(self):
183
+        return self.socket.fileno()
184
+
185
+    # Copy-pasted from Python 3.5 source code
186
+    def _decref_socketios(self):
187
+        if self._makefile_refs > 0:
188
+            self._makefile_refs -= 1
189
+        if self._closed:
190
+            self.close()
191
+
192
+    def recv(self, *args, **kwargs):
193
+        try:
194
+            data = self.connection.recv(*args, **kwargs)
195
+        except OpenSSL.SSL.SysCallError as e:
196
+            if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'):
197
+                return b''
198
+            else:
199
+                raise SocketError(str(e))
200
+        except OpenSSL.SSL.ZeroReturnError as e:
201
+            if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN:
202
+                return b''
203
+            else:
204
+                raise
205
+        except OpenSSL.SSL.WantReadError:
206
+            rd, wd, ed = select.select(
207
+                [self.socket], [], [], self.socket.gettimeout())
208
+            if not rd:
209
+                raise timeout('The read operation timed out')
210
+            else:
211
+                return self.recv(*args, **kwargs)
212
+        else:
213
+            return data
214
+
215
+    def recv_into(self, *args, **kwargs):
216
+        try:
217
+            return self.connection.recv_into(*args, **kwargs)
218
+        except OpenSSL.SSL.SysCallError as e:
219
+            if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'):
220
+                return 0
221
+            else:
222
+                raise SocketError(str(e))
223
+        except OpenSSL.SSL.ZeroReturnError as e:
224
+            if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN:
225
+                return 0
226
+            else:
227
+                raise
228
+        except OpenSSL.SSL.WantReadError:
229
+            rd, wd, ed = select.select(
230
+                [self.socket], [], [], self.socket.gettimeout())
231
+            if not rd:
232
+                raise timeout('The read operation timed out')
233
+            else:
234
+                return self.recv_into(*args, **kwargs)
235
+
236
+    def settimeout(self, timeout):
237
+        return self.socket.settimeout(timeout)
238
+
239
+    def _send_until_done(self, data):
240
+        while True:
241
+            try:
242
+                return self.connection.send(data)
243
+            except OpenSSL.SSL.WantWriteError:
244
+                _, wlist, _ = select.select([], [self.socket], [],
245
+                                            self.socket.gettimeout())
246
+                if not wlist:
247
+                    raise timeout()
248
+                continue
249
+
250
+    def sendall(self, data):
251
+        total_sent = 0
252
+        while total_sent < len(data):
253
+            sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE])
254
+            total_sent += sent
255
+
256
+    def shutdown(self):
257
+        # FIXME rethrow compatible exceptions should we ever use this
258
+        self.connection.shutdown()
259
+
260
+    def close(self):
261
+        if self._makefile_refs < 1:
262
+            try:
263
+                self._closed = True
264
+                return self.connection.close()
265
+            except OpenSSL.SSL.Error:
266
+                return
267
+        else:
268
+            self._makefile_refs -= 1
269
+
270
+    def getpeercert(self, binary_form=False):
271
+        x509 = self.connection.get_peer_certificate()
272
+
273
+        if not x509:
274
+            return x509
275
+
276
+        if binary_form:
277
+            return OpenSSL.crypto.dump_certificate(
278
+                OpenSSL.crypto.FILETYPE_ASN1,
279
+                x509)
280
+
281
+        return {
282
+            'subject': (
283
+                (('commonName', x509.get_subject().CN),),
284
+            ),
285
+            'subjectAltName': [
286
+                ('DNS', value)
287
+                for value in get_subj_alt_name(x509)
288
+            ]
289
+        }
290
+
291
+    def _reuse(self):
292
+        self._makefile_refs += 1
293
+
294
+    def _drop(self):
295
+        if self._makefile_refs < 1:
296
+            self.close()
297
+        else:
298
+            self._makefile_refs -= 1
299
+
300
+
301
+if _fileobject:  # Platform-specific: Python 2
302
+    def makefile(self, mode, bufsize=-1):
303
+        self._makefile_refs += 1
304
+        return _fileobject(self, mode, bufsize, close=True)
305
+else:  # Platform-specific: Python 3
306
+    makefile = backport_makefile
307
+
308
+WrappedSocket.makefile = makefile
309
+
310
+
311
+def _verify_callback(cnx, x509, err_no, err_depth, return_code):
312
+    return err_no == 0
313
+
314
+
315
+def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
316
+                    ca_certs=None, server_hostname=None,
317
+                    ssl_version=None, ca_cert_dir=None):
318
+    ctx = OpenSSL.SSL.Context(_openssl_versions[ssl_version])
319
+    if certfile:
320
+        keyfile = keyfile or certfile  # Match behaviour of the normal python ssl library
321
+        ctx.use_certificate_file(certfile)
322
+    if keyfile:
323
+        ctx.use_privatekey_file(keyfile)
324
+    if cert_reqs != ssl.CERT_NONE:
325
+        ctx.set_verify(_openssl_verify[cert_reqs], _verify_callback)
326
+    if ca_certs or ca_cert_dir:
327
+        try:
328
+            ctx.load_verify_locations(ca_certs, ca_cert_dir)
329
+        except OpenSSL.SSL.Error as e:
330
+            raise ssl.SSLError('bad ca_certs: %r' % ca_certs, e)
331
+    else:
332
+        ctx.set_default_verify_paths()
333
+
334
+    # Disable TLS compression to mitigate CRIME attack (issue #309)
335
+    OP_NO_COMPRESSION = 0x20000
336
+    ctx.set_options(OP_NO_COMPRESSION)
337
+
338
+    # Set list of supported ciphersuites.
339
+    ctx.set_cipher_list(DEFAULT_SSL_CIPHER_LIST)
340
+
341
+    cnx = OpenSSL.SSL.Connection(ctx, sock)
342
+    if isinstance(server_hostname, six.text_type):  # Platform-specific: Python 3
343
+        server_hostname = server_hostname.encode('utf-8')
344
+    cnx.set_tlsext_host_name(server_hostname)
345
+    cnx.set_connect_state()
346
+    while True:
347
+        try:
348
+            cnx.do_handshake()
349
+        except OpenSSL.SSL.WantReadError:
350
+            rd, _, _ = select.select([sock], [], [], sock.gettimeout())
351
+            if not rd:
352
+                raise timeout('select timed out')
353
+            continue
354
+        except OpenSSL.SSL.Error as e:
355
+            raise ssl.SSLError('bad handshake: %r' % e)
356
+        break
357
+
358
+    return WrappedSocket(cnx, sock)

+ 172
- 0
Contents/Libraries/Shared/requests/packages/urllib3/contrib/socks.py View File

1
+# -*- coding: utf-8 -*-
2
+"""
3
+SOCKS support for urllib3
4
+~~~~~~~~~~~~~~~~~~~~~~~~~
5
+
6
+This contrib module contains provisional support for SOCKS proxies from within
7
+urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and
8
+SOCKS5. To enable its functionality, either install PySocks or install this
9
+module with the ``socks`` extra.
10
+
11
+Known Limitations:
12
+
13
+- Currently PySocks does not support contacting remote websites via literal
14
+  IPv6 addresses. Any such connection attempt will fail.
15
+- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any
16
+  such connection attempt will fail.
17
+"""
18
+from __future__ import absolute_import
19
+
20
+try:
21
+    import socks
22
+except ImportError:
23
+    import warnings
24
+    from ..exceptions import DependencyWarning
25
+
26
+    warnings.warn((
27
+        'SOCKS support in urllib3 requires the installation of optional '
28
+        'dependencies: specifically, PySocks.  For more information, see '
29
+        'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies'
30
+        ),
31
+        DependencyWarning
32
+    )
33
+    raise
34
+
35
+from socket import error as SocketError, timeout as SocketTimeout
36
+
37
+from ..connection import (
38
+    HTTPConnection, HTTPSConnection
39
+)
40
+from ..connectionpool import (
41
+    HTTPConnectionPool, HTTPSConnectionPool
42
+)
43
+from ..exceptions import ConnectTimeoutError, NewConnectionError
44
+from ..poolmanager import PoolManager
45
+from ..util.url import parse_url
46
+
47
+try:
48
+    import ssl
49
+except ImportError:
50
+    ssl = None
51
+
52
+
53
+class SOCKSConnection(HTTPConnection):
54
+    """
55
+    A plain-text HTTP connection that connects via a SOCKS proxy.
56
+    """
57
+    def __init__(self, *args, **kwargs):
58
+        self._socks_options = kwargs.pop('_socks_options')
59
+        super(SOCKSConnection, self).__init__(*args, **kwargs)
60
+
61
+    def _new_conn(self):
62
+        """
63
+        Establish a new connection via the SOCKS proxy.
64
+        """
65
+        extra_kw = {}
66
+        if self.source_address:
67
+            extra_kw['source_address'] = self.source_address
68
+
69
+        if self.socket_options:
70
+            extra_kw['socket_options'] = self.socket_options
71
+
72
+        try:
73
+            conn = socks.create_connection(
74
+                (self.host, self.port),
75
+                proxy_type=self._socks_options['socks_version'],
76
+                proxy_addr=self._socks_options['proxy_host'],
77
+                proxy_port=self._socks_options['proxy_port'],
78
+                proxy_username=self._socks_options['username'],
79
+                proxy_password=self._socks_options['password'],
80
+                timeout=self.timeout,
81
+                **extra_kw
82
+            )
83
+
84
+        except SocketTimeout as e:
85
+            raise ConnectTimeoutError(
86
+                self, "Connection to %s timed out. (connect timeout=%s)" %
87
+                (self.host, self.timeout))
88
+
89
+        except socks.ProxyError as e:
90
+            # This is fragile as hell, but it seems to be the only way to raise
91
+            # useful errors here.
92
+            if e.socket_err:
93
+                error = e.socket_err
94
+                if isinstance(error, SocketTimeout):
95
+                    raise ConnectTimeoutError(
96
+                        self,
97
+                        "Connection to %s timed out. (connect timeout=%s)" %
98
+                        (self.host, self.timeout)
99
+                    )
100
+                else:
101
+                    raise NewConnectionError(
102
+                        self,
103
+                        "Failed to establish a new connection: %s" % error
104
+                    )
105
+            else:
106
+                raise NewConnectionError(
107
+                    self,
108
+                    "Failed to establish a new connection: %s" % e
109
+                )
110
+
111
+        except SocketError as e:  # Defensive: PySocks should catch all these.
112
+            raise NewConnectionError(
113
+                self, "Failed to establish a new connection: %s" % e)
114
+
115
+        return conn
116
+
117
+
118
+# We don't need to duplicate the Verified/Unverified distinction from
119
+# urllib3/connection.py here because the HTTPSConnection will already have been
120
+# correctly set to either the Verified or Unverified form by that module. This
121
+# means the SOCKSHTTPSConnection will automatically be the correct type.
122
+class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection):
123
+    pass
124
+
125
+
126
+class SOCKSHTTPConnectionPool(HTTPConnectionPool):
127
+    ConnectionCls = SOCKSConnection
128
+
129
+
130
+class SOCKSHTTPSConnectionPool(HTTPSConnectionPool):
131
+    ConnectionCls = SOCKSHTTPSConnection
132
+
133
+
134
+class SOCKSProxyManager(PoolManager):
135
+    """
136
+    A version of the urllib3 ProxyManager that routes connections via the
137
+    defined SOCKS proxy.
138
+    """
139
+    pool_classes_by_scheme = {
140
+        'http': SOCKSHTTPConnectionPool,
141
+        'https': SOCKSHTTPSConnectionPool,
142
+    }
143
+
144
+    def __init__(self, proxy_url, username=None, password=None,
145
+                 num_pools=10, headers=None, **connection_pool_kw):
146
+        parsed = parse_url(proxy_url)
147
+
148
+        if parsed.scheme == 'socks5':
149
+            socks_version = socks.PROXY_TYPE_SOCKS5
150
+        elif parsed.scheme == 'socks4':
151
+            socks_version = socks.PROXY_TYPE_SOCKS4
152
+        else:
153
+            raise ValueError(
154
+                "Unable to determine SOCKS version from %s" % proxy_url
155
+            )
156
+
157
+        self.proxy_url = proxy_url
158
+
159
+        socks_options = {
160
+            'socks_version': socks_version,
161
+            'proxy_host': parsed.host,
162
+            'proxy_port': parsed.port,
163
+            'username': username,
164
+            'password': password,
165
+        }
166
+        connection_pool_kw['_socks_options'] = socks_options
167
+
168
+        super(SOCKSProxyManager, self).__init__(
169
+            num_pools, headers, **connection_pool_kw
170
+        )
171
+
172
+        self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme

+ 209
- 0
Contents/Libraries/Shared/requests/packages/urllib3/exceptions.py View File

1
+from __future__ import absolute_import
2
+# Base Exceptions
3
+
4
+
5
+class HTTPError(Exception):
6
+    "Base exception used by this module."
7
+    pass
8
+
9
+
10
+class HTTPWarning(Warning):
11
+    "Base warning used by this module."
12
+    pass
13
+
14
+
15
+class PoolError(HTTPError):
16
+    "Base exception for errors caused within a pool."
17
+    def __init__(self, pool, message):
18
+        self.pool = pool
19
+        HTTPError.__init__(self, "%s: %s" % (pool, message))
20
+
21
+    def __reduce__(self):
22
+        # For pickling purposes.
23
+        return self.__class__, (None, None)
24
+
25
+
26
+class RequestError(PoolError):
27
+    "Base exception for PoolErrors that have associated URLs."
28
+    def __init__(self, pool, url, message):
29
+        self.url = url
30
+        PoolError.__init__(self, pool, message)
31
+
32
+    def __reduce__(self):
33
+        # For pickling purposes.
34
+        return self.__class__, (None, self.url, None)
35
+
36
+
37
+class SSLError(HTTPError):
38
+    "Raised when SSL certificate fails in an HTTPS connection."
39
+    pass
40
+
41
+
42
+class ProxyError(HTTPError):
43
+    "Raised when the connection to a proxy fails."
44
+    pass
45
+
46
+
47
+class DecodeError(HTTPError):
48
+    "Raised when automatic decoding based on Content-Type fails."
49
+    pass
50
+
51
+
52
+class ProtocolError(HTTPError):
53
+    "Raised when something unexpected happens mid-request/response."
54
+    pass
55
+
56
+
57
+#: Renamed to ProtocolError but aliased for backwards compatibility.
58
+ConnectionError = ProtocolError
59
+
60
+
61
+# Leaf Exceptions
62
+
63
+class MaxRetryError(RequestError):
64
+    """Raised when the maximum number of retries is exceeded.
65
+
66
+    :param pool: The connection pool
67
+    :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool`
68
+    :param string url: The requested Url
69
+    :param exceptions.Exception reason: The underlying error
70
+
71
+    """
72
+
73
+    def __init__(self, pool, url, reason=None):
74
+        self.reason = reason
75
+
76
+        message = "Max retries exceeded with url: %s (Caused by %r)" % (
77
+            url, reason)
78
+
79
+        RequestError.__init__(self, pool, url, message)
80
+
81
+
82
+class HostChangedError(RequestError):
83
+    "Raised when an existing pool gets a request for a foreign host."
84
+
85
+    def __init__(self, pool, url, retries=3):
86
+        message = "Tried to open a foreign host with url: %s" % url
87
+        RequestError.__init__(self, pool, url, message)
88
+        self.retries = retries
89
+
90
+
91
+class TimeoutStateError(HTTPError):
92
+    """ Raised when passing an invalid state to a timeout """
93
+    pass
94
+
95
+
96
+class TimeoutError(HTTPError):
97
+    """ Raised when a socket timeout error occurs.
98
+
99
+    Catching this error will catch both :exc:`ReadTimeoutErrors
100
+    <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`.
101
+    """
102
+    pass
103
+
104
+
105
+class ReadTimeoutError(TimeoutError, RequestError):
106
+    "Raised when a socket timeout occurs while receiving data from a server"
107
+    pass
108
+
109
+
110
+# This timeout error does not have a URL attached and needs to inherit from the
111
+# base HTTPError
112
+class ConnectTimeoutError(TimeoutError):
113
+    "Raised when a socket timeout occurs while connecting to a server"
114
+    pass
115
+
116
+
117
+class NewConnectionError(ConnectTimeoutError, PoolError):
118
+    "Raised when we fail to establish a new connection. Usually ECONNREFUSED."
119
+    pass
120
+
121
+
122
+class EmptyPoolError(PoolError):
123
+    "Raised when a pool runs out of connections and no more are allowed."
124
+    pass
125
+
126
+
127
+class ClosedPoolError(PoolError):
128
+    "Raised when a request enters a pool after the pool has been closed."
129
+    pass
130
+
131
+
132
+class LocationValueError(ValueError, HTTPError):
133
+    "Raised when there is something wrong with a given URL input."
134
+    pass
135
+
136
+
137
+class LocationParseError(LocationValueError):
138
+    "Raised when get_host or similar fails to parse the URL input."
139
+
140
+    def __init__(self, location):
141
+        message = "Failed to parse: %s" % location
142
+        HTTPError.__init__(self, message)
143
+
144
+        self.location = location
145
+
146
+
147
+class ResponseError(HTTPError):
148
+    "Used as a container for an error reason supplied in a MaxRetryError."
149
+    GENERIC_ERROR = 'too many error responses'
150
+    SPECIFIC_ERROR = 'too many {status_code} error responses'
151
+
152
+
153
+class SecurityWarning(HTTPWarning):
154
+    "Warned when perfoming security reducing actions"
155
+    pass
156
+
157
+
158
+class SubjectAltNameWarning(SecurityWarning):
159
+    "Warned when connecting to a host with a certificate missing a SAN."
160
+    pass
161
+
162
+
163
+class InsecureRequestWarning(SecurityWarning):
164
+    "Warned when making an unverified HTTPS request."
165
+    pass
166
+
167
+
168
+class SystemTimeWarning(SecurityWarning):
169
+    "Warned when system time is suspected to be wrong"
170
+    pass
171
+
172
+
173
+class InsecurePlatformWarning(SecurityWarning):
174
+    "Warned when certain SSL configuration is not available on a platform."
175
+    pass
176
+
177
+
178
+class SNIMissingWarning(HTTPWarning):
179
+    "Warned when making a HTTPS request without SNI available."
180
+    pass
181
+
182
+
183
+class DependencyWarning(HTTPWarning):
184
+    """
185
+    Warned when an attempt is made to import a module with missing optional
186
+    dependencies.
187
+    """
188
+    pass
189
+
190
+
191
+class ResponseNotChunked(ProtocolError, ValueError):
192
+    "Response needs to be chunked in order to read it as chunks."
193
+    pass
194
+
195
+
196
+class ProxySchemeUnknown(AssertionError, ValueError):
197
+    "ProxyManager does not support the supplied scheme"
198
+    # TODO(t-8ch): Stop inheriting from AssertionError in v2.0.
199
+
200
+    def __init__(self, scheme):
201
+        message = "Not supported proxy scheme %s" % scheme
202
+        super(ProxySchemeUnknown, self).__init__(message)
203
+
204
+
205
+class HeaderParsingError(HTTPError):
206
+    "Raised by assert_header_parsing, but we convert it to a log.warning statement."
207
+    def __init__(self, defects, unparsed_data):
208
+        message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data)
209
+        super(HeaderParsingError, self).__init__(message)

+ 178
- 0
Contents/Libraries/Shared/requests/packages/urllib3/fields.py View File

1
+from __future__ import absolute_import
2
+import email.utils
3
+import mimetypes
4
+
5
+from .packages import six
6
+
7
+
8
+def guess_content_type(filename, default='application/octet-stream'):
9
+    """
10
+    Guess the "Content-Type" of a file.
11
+
12
+    :param filename:
13
+        The filename to guess the "Content-Type" of using :mod:`mimetypes`.
14
+    :param default:
15
+        If no "Content-Type" can be guessed, default to `default`.
16
+    """
17
+    if filename:
18
+        return mimetypes.guess_type(filename)[0] or default
19
+    return default
20
+
21
+
22
+def format_header_param(name, value):
23
+    """
24
+    Helper function to format and quote a single header parameter.
25
+
26
+    Particularly useful for header parameters which might contain
27
+    non-ASCII values, like file names. This follows RFC 2231, as
28
+    suggested by RFC 2388 Section 4.4.
29
+
30
+    :param name:
31
+        The name of the parameter, a string expected to be ASCII only.
32
+    :param value:
33
+        The value of the parameter, provided as a unicode string.
34
+    """
35
+    if not any(ch in value for ch in '"\\\r\n'):
36
+        result = '%s="%s"' % (name, value)
37
+        try:
38
+            result.encode('ascii')
39
+        except (UnicodeEncodeError, UnicodeDecodeError):
40
+            pass
41
+        else:
42
+            return result
43
+    if not six.PY3 and isinstance(value, six.text_type):  # Python 2:
44
+        value = value.encode('utf-8')
45
+    value = email.utils.encode_rfc2231(value, 'utf-8')
46
+    value = '%s*=%s' % (name, value)
47
+    return value
48
+
49
+
50
+class RequestField(object):
51
+    """
52
+    A data container for request body parameters.
53
+
54
+    :param name:
55
+        The name of this request field.
56
+    :param data:
57
+        The data/value body.
58
+    :param filename:
59
+        An optional filename of the request field.
60
+    :param headers:
61
+        An optional dict-like object of headers to initially use for the field.
62
+    """
63
+    def __init__(self, name, data, filename=None, headers=None):
64
+        self._name = name
65
+        self._filename = filename
66
+        self.data = data
67
+        self.headers = {}
68
+        if headers:
69
+            self.headers = dict(headers)
70
+
71
+    @classmethod
72
+    def from_tuples(cls, fieldname, value):
73
+        """
74
+        A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters.
75
+
76
+        Supports constructing :class:`~urllib3.fields.RequestField` from
77
+        parameter of key/value strings AND key/filetuple. A filetuple is a
78
+        (filename, data, MIME type) tuple where the MIME type is optional.
79
+        For example::
80
+
81
+            'foo': 'bar',
82
+            'fakefile': ('foofile.txt', 'contents of foofile'),
83
+            'realfile': ('barfile.txt', open('realfile').read()),
84
+            'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'),
85
+            'nonamefile': 'contents of nonamefile field',
86
+
87
+        Field names and filenames must be unicode.
88
+        """
89
+        if isinstance(value, tuple):
90
+            if len(value) == 3:
91
+                filename, data, content_type = value
92
+            else:
93
+                filename, data = value
94
+                content_type = guess_content_type(filename)
95
+        else:
96
+            filename = None
97
+            content_type = None
98
+            data = value
99
+
100
+        request_param = cls(fieldname, data, filename=filename)
101
+        request_param.make_multipart(content_type=content_type)
102
+
103
+        return request_param
104
+
105
+    def _render_part(self, name, value):
106
+        """
107
+        Overridable helper function to format a single header parameter.
108
+
109
+        :param name:
110
+            The name of the parameter, a string expected to be ASCII only.
111
+        :param value:
112
+            The value of the parameter, provided as a unicode string.
113
+        """
114
+        return format_header_param(name, value)
115
+
116
+    def _render_parts(self, header_parts):
117
+        """
118
+        Helper function to format and quote a single header.
119
+
120
+        Useful for single headers that are composed of multiple items. E.g.,
121
+        'Content-Disposition' fields.
122
+
123
+        :param header_parts:
124
+            A sequence of (k, v) typles or a :class:`dict` of (k, v) to format
125
+            as `k1="v1"; k2="v2"; ...`.
126
+        """
127
+        parts = []
128
+        iterable = header_parts
129
+        if isinstance(header_parts, dict):
130
+            iterable = header_parts.items()
131
+
132
+        for name, value in iterable:
133
+            if value:
134
+                parts.append(self._render_part(name, value))
135
+
136
+        return '; '.join(parts)
137
+
138
+    def render_headers(self):
139
+        """
140
+        Renders the headers for this request field.
141
+        """
142
+        lines = []
143
+
144
+        sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location']
145
+        for sort_key in sort_keys:
146
+            if self.headers.get(sort_key, False):
147
+                lines.append('%s: %s' % (sort_key, self.headers[sort_key]))
148
+
149
+        for header_name, header_value in self.headers.items():
150
+            if header_name not in sort_keys:
151
+                if header_value:
152
+                    lines.append('%s: %s' % (header_name, header_value))
153
+
154
+        lines.append('\r\n')
155
+        return '\r\n'.join(lines)
156
+
157
+    def make_multipart(self, content_disposition=None, content_type=None,
158
+                       content_location=None):
159
+        """
160
+        Makes this request field into a multipart request field.
161
+
162
+        This method overrides "Content-Disposition", "Content-Type" and
163
+        "Content-Location" headers to the request parameter.
164
+
165
+        :param content_type:
166
+            The 'Content-Type' of the request body.
167
+        :param content_location:
168
+            The 'Content-Location' of the request body.
169
+
170
+        """
171
+        self.headers['Content-Disposition'] = content_disposition or 'form-data'
172
+        self.headers['Content-Disposition'] += '; '.join([
173
+            '', self._render_parts(
174
+                (('name', self._name), ('filename', self._filename))
175
+            )
176
+        ])
177
+        self.headers['Content-Type'] = content_type
178
+        self.headers['Content-Location'] = content_location

+ 94
- 0
Contents/Libraries/Shared/requests/packages/urllib3/filepost.py View File

1
+from __future__ import absolute_import
2
+import codecs
3
+
4
+from uuid import uuid4
5
+from io import BytesIO
6
+
7
+from .packages import six
8
+from .packages.six import b
9
+from .fields import RequestField
10
+
11
+writer = codecs.lookup('utf-8')[3]
12
+
13
+
14
+def choose_boundary():
15
+    """
16
+    Our embarassingly-simple replacement for mimetools.choose_boundary.
17
+    """
18
+    return uuid4().hex
19
+
20
+
21
+def iter_field_objects(fields):
22
+    """
23
+    Iterate over fields.
24
+
25
+    Supports list of (k, v) tuples and dicts, and lists of
26
+    :class:`~urllib3.fields.RequestField`.
27
+
28
+    """
29
+    if isinstance(fields, dict):
30
+        i = six.iteritems(fields)
31
+    else:
32
+        i = iter(fields)
33
+
34
+    for field in i:
35
+        if isinstance(field, RequestField):
36
+            yield field
37
+        else:
38
+            yield RequestField.from_tuples(*field)
39
+
40
+
41
+def iter_fields(fields):
42
+    """
43
+    .. deprecated:: 1.6
44
+
45
+    Iterate over fields.
46
+
47
+    The addition of :class:`~urllib3.fields.RequestField` makes this function
48
+    obsolete. Instead, use :func:`iter_field_objects`, which returns
49
+    :class:`~urllib3.fields.RequestField` objects.
50
+
51
+    Supports list of (k, v) tuples and dicts.
52
+    """
53
+    if isinstance(fields, dict):
54
+        return ((k, v) for k, v in six.iteritems(fields))
55
+
56
+    return ((k, v) for k, v in fields)
57
+
58
+
59
+def encode_multipart_formdata(fields, boundary=None):
60
+    """
61
+    Encode a dictionary of ``fields`` using the multipart/form-data MIME format.
62
+
63
+    :param fields:
64
+        Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`).
65
+
66
+    :param boundary:
67
+        If not specified, then a random boundary will be generated using
68
+        :func:`mimetools.choose_boundary`.
69
+    """
70
+    body = BytesIO()
71
+    if boundary is None:
72
+        boundary = choose_boundary()
73
+
74
+    for field in iter_field_objects(fields):
75
+        body.write(b('--%s\r\n' % (boundary)))
76
+
77
+        writer(body).write(field.render_headers())
78
+        data = field.data
79
+
80
+        if isinstance(data, int):
81
+            data = str(data)  # Backwards compatibility
82
+
83
+        if isinstance(data, six.text_type):
84
+            writer(body).write(data)
85
+        else:
86
+            body.write(data)
87
+
88
+        body.write(b'\r\n')
89
+
90
+    body.write(b('--%s--\r\n' % (boundary)))
91
+
92
+    content_type = str('multipart/form-data; boundary=%s' % boundary)
93
+
94
+    return body.getvalue(), content_type

+ 5
- 0
Contents/Libraries/Shared/requests/packages/urllib3/packages/__init__.py View File

1
+from __future__ import absolute_import
2
+
3
+from . import ssl_match_hostname
4
+
5
+__all__ = ('ssl_match_hostname', )

+ 0
- 0
Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/__init__.py View File


+ 53
- 0
Contents/Libraries/Shared/requests/packages/urllib3/packages/backports/makefile.py View File

1
+# -*- coding: utf-8 -*-
2
+"""
3
+backports.makefile
4
+~~~~~~~~~~~~~~~~~~
5
+
6
+Backports the Python 3 ``socket.makefile`` method for use with anything that
7
+wants to create a "fake" socket object.
8
+"""
9
+import io
10
+
11
+from socket import SocketIO
12
+
13
+
14
+def backport_makefile(self, mode="r", buffering=None, encoding=None,
15
+                      errors=None, newline=None):
16
+    """
17
+    Backport of ``socket.makefile`` from Python 3.5.
18
+    """
19
+    if not set(mode) <= set(["r", "w", "b"]):
20
+        raise ValueError(
21
+            "invalid mode %r (only r, w, b allowed)" % (mode,)
22
+        )
23
+    writing = "w" in mode
24
+    reading = "r" in mode or not writing
25
+    assert reading or writing
26
+    binary = "b" in mode
27
+    rawmode = ""
28
+    if reading:
29
+        rawmode += "r"
30
+    if writing:
31
+        rawmode += "w"
32
+    raw = SocketIO(self, rawmode)
33
+    self._makefile_refs += 1
34
+    if buffering is None:
35
+        buffering = -1
36
+    if buffering < 0:
37
+        buffering = io.DEFAULT_BUFFER_SIZE
38
+    if buffering == 0:
39
+        if not binary:
40
+            raise ValueError("unbuffered streams must be binary")
41
+        return raw
42
+    if reading and writing:
43
+        buffer = io.BufferedRWPair(raw, raw, buffering)
44
+    elif reading:
45
+        buffer = io.BufferedReader(raw, buffering)
46
+    else:
47
+        assert writing
48
+        buffer = io.BufferedWriter(raw, buffering)
49
+    if binary:
50
+        return buffer
51
+    text = io.TextIOWrapper(buffer, encoding, errors, newline)
52
+    text.mode = mode
53
+    return text

+ 259
- 0
Contents/Libraries/Shared/requests/packages/urllib3/packages/ordered_dict.py View File

1
+# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
2
+# Passes Python2.7's test suite and incorporates all the latest updates.
3
+# Copyright 2009 Raymond Hettinger, released under the MIT License.
4
+# http://code.activestate.com/recipes/576693/
5
+try:
6
+    from thread import get_ident as _get_ident
7
+except ImportError:
8
+    from dummy_thread import get_ident as _get_ident
9
+
10
+try:
11
+    from _abcoll import KeysView, ValuesView, ItemsView
12
+except ImportError:
13
+    pass
14
+
15
+
16
+class OrderedDict(dict):
17
+    'Dictionary that remembers insertion order'
18
+    # An inherited dict maps keys to values.
19
+    # The inherited dict provides __getitem__, __len__, __contains__, and get.
20
+    # The remaining methods are order-aware.
21
+    # Big-O running times for all methods are the same as for regular dictionaries.
22
+
23
+    # The internal self.__map dictionary maps keys to links in a doubly linked list.
24
+    # The circular doubly linked list starts and ends with a sentinel element.
25
+    # The sentinel element never gets deleted (this simplifies the algorithm).
26
+    # Each link is stored as a list of length three:  [PREV, NEXT, KEY].
27
+
28
+    def __init__(self, *args, **kwds):
29
+        '''Initialize an ordered dictionary.  Signature is the same as for
30
+        regular dictionaries, but keyword arguments are not recommended
31
+        because their insertion order is arbitrary.
32
+
33
+        '''
34
+        if len(args) > 1:
35
+            raise TypeError('expected at most 1 arguments, got %d' % len(args))
36
+        try:
37
+            self.__root
38
+        except AttributeError:
39
+            self.__root = root = []                     # sentinel node
40
+            root[:] = [root, root, None]
41
+            self.__map = {}
42
+        self.__update(*args, **kwds)
43
+
44
+    def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
45
+        'od.__setitem__(i, y) <==> od[i]=y'
46
+        # Setting a new item creates a new link which goes at the end of the linked
47
+        # list, and the inherited dictionary is updated with the new key/value pair.
48
+        if key not in self:
49
+            root = self.__root
50
+            last = root[0]
51
+            last[1] = root[0] = self.__map[key] = [last, root, key]
52
+        dict_setitem(self, key, value)
53
+
54
+    def __delitem__(self, key, dict_delitem=dict.__delitem__):
55
+        'od.__delitem__(y) <==> del od[y]'
56
+        # Deleting an existing item uses self.__map to find the link which is
57
+        # then removed by updating the links in the predecessor and successor nodes.
58
+        dict_delitem(self, key)
59
+        link_prev, link_next, key = self.__map.pop(key)
60
+        link_prev[1] = link_next
61
+        link_next[0] = link_prev
62
+
63
+    def __iter__(self):
64
+        'od.__iter__() <==> iter(od)'
65
+        root = self.__root
66
+        curr = root[1]
67
+        while curr is not root:
68
+            yield curr[2]
69
+            curr = curr[1]
70
+
71
+    def __reversed__(self):
72
+        'od.__reversed__() <==> reversed(od)'
73
+        root = self.__root
74
+        curr = root[0]
75
+        while curr is not root:
76
+            yield curr[2]
77
+            curr = curr[0]
78
+
79
+    def clear(self):
80
+        'od.clear() -> None.  Remove all items from od.'
81
+        try:
82
+            for node in self.__map.itervalues():
83
+                del node[:]
84
+            root = self.__root
85
+            root[:] = [root, root, None]
86
+            self.__map.clear()
87
+        except AttributeError:
88
+            pass
89
+        dict.clear(self)
90
+
91
+    def popitem(self, last=True):
92
+        '''od.popitem() -> (k, v), return and remove a (key, value) pair.
93
+        Pairs are returned in LIFO order if last is true or FIFO order if false.
94
+
95
+        '''
96
+        if not self:
97
+            raise KeyError('dictionary is empty')
98
+        root = self.__root
99
+        if last:
100
+            link = root[0]
101
+            link_prev = link[0]
102
+            link_prev[1] = root
103
+            root[0] = link_prev
104
+        else:
105
+            link = root[1]
106
+            link_next = link[1]
107
+            root[1] = link_next
108
+            link_next[0] = root
109
+        key = link[2]
110
+        del self.__map[key]
111
+        value = dict.pop(self, key)
112
+        return key, value
113
+
114
+    # -- the following methods do not depend on the internal structure --
115
+
116
+    def keys(self):
117
+        'od.keys() -> list of keys in od'
118
+        return list(self)
119
+
120
+    def values(self):
121
+        'od.values() -> list of values in od'
122
+        return [self[key] for key in self]
123
+
124
+    def items(self):
125
+        'od.items() -> list of (key, value) pairs in od'
126
+        return [(key, self[key]) for key in self]
127
+
128
+    def iterkeys(self):
129
+        'od.iterkeys() -> an iterator over the keys in od'
130
+        return iter(self)
131
+
132
+    def itervalues(self):
133
+        'od.itervalues -> an iterator over the values in od'
134
+        for k in self:
135
+            yield self[k]
136
+
137
+    def iteritems(self):
138
+        'od.iteritems -> an iterator over the (key, value) items in od'
139
+        for k in self:
140
+            yield (k, self[k])
141
+
142
+    def update(*args, **kwds):
143
+        '''od.update(E, **F) -> None.  Update od from dict/iterable E and F.
144
+
145
+        If E is a dict instance, does:           for k in E: od[k] = E[k]
146
+        If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
147
+        Or if E is an iterable of items, does:   for k, v in E: od[k] = v
148
+        In either case, this is followed by:     for k, v in F.items(): od[k] = v
149
+
150
+        '''
151
+        if len(args) > 2:
152
+            raise TypeError('update() takes at most 2 positional '
153
+                            'arguments (%d given)' % (len(args),))
154
+        elif not args:
155
+            raise TypeError('update() takes at least 1 argument (0 given)')
156
+        self = args[0]
157
+        # Make progressively weaker assumptions about "other"
158
+        other = ()
159
+        if len(args) == 2:
160
+            other = args[1]
161
+        if isinstance(other, dict):
162
+            for key in other:
163
+                self[key] = other[key]
164
+        elif hasattr(other, 'keys'):
165
+            for key in other.keys():
166
+                self[key] = other[key]
167
+        else:
168
+            for key, value in other:
169
+                self[key] = value
170
+        for key, value in kwds.items():
171
+            self[key] = value
172
+
173
+    __update = update  # let subclasses override update without breaking __init__
174
+
175
+    __marker = object()
176
+
177
+    def pop(self, key, default=__marker):
178
+        '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
179
+        If key is not found, d is returned if given, otherwise KeyError is raised.
180
+
181
+        '''
182
+        if key in self:
183
+            result = self[key]
184
+            del self[key]
185
+            return result
186
+        if default is self.__marker:
187
+            raise KeyError(key)
188
+        return default
189
+
190
+    def setdefault(self, key, default=None):
191
+        'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
192
+        if key in self:
193
+            return self[key]
194
+        self[key] = default
195
+        return default
196
+
197
+    def __repr__(self, _repr_running={}):
198
+        'od.__repr__() <==> repr(od)'
199
+        call_key = id(self), _get_ident()
200
+        if call_key in _repr_running:
201
+            return '...'
202
+        _repr_running[call_key] = 1
203
+        try:
204
+            if not self:
205
+                return '%s()' % (self.__class__.__name__,)
206
+            return '%s(%r)' % (self.__class__.__name__, self.items())
207
+        finally:
208
+            del _repr_running[call_key]
209
+
210
+    def __reduce__(self):
211
+        'Return state information for pickling'
212
+        items = [[k, self[k]] for k in self]
213
+        inst_dict = vars(self).copy()
214
+        for k in vars(OrderedDict()):
215
+            inst_dict.pop(k, None)
216
+        if inst_dict:
217
+            return (self.__class__, (items,), inst_dict)
218
+        return self.__class__, (items,)
219
+
220
+    def copy(self):
221
+        'od.copy() -> a shallow copy of od'
222
+        return self.__class__(self)
223
+
224
+    @classmethod
225
+    def fromkeys(cls, iterable, value=None):
226
+        '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
227
+        and values equal to v (which defaults to None).
228
+
229
+        '''
230
+        d = cls()
231
+        for key in iterable:
232
+            d[key] = value
233
+        return d
234
+
235
+    def __eq__(self, other):
236
+        '''od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
237
+        while comparison to a regular mapping is order-insensitive.
238
+
239
+        '''
240
+        if isinstance(other, OrderedDict):
241
+            return len(self)==len(other) and self.items() == other.items()
242
+        return dict.__eq__(self, other)
243
+
244
+    def __ne__(self, other):
245
+        return not self == other
246
+
247
+    # -- the following methods are only used in Python 2.7 --
248
+
249
+    def viewkeys(self):
250
+        "od.viewkeys() -> a set-like object providing a view on od's keys"
251
+        return KeysView(self)
252
+
253
+    def viewvalues(self):
254
+        "od.viewvalues() -> an object providing a view on od's values"
255
+        return ValuesView(self)
256
+
257
+    def viewitems(self):
258
+        "od.viewitems() -> a set-like object providing a view on od's items"
259
+        return ItemsView(self)

+ 868
- 0
Contents/Libraries/Shared/requests/packages/urllib3/packages/six.py View File

1
+"""Utilities for writing code that runs on Python 2 and 3"""
2
+
3
+# Copyright (c) 2010-2015 Benjamin Peterson
4
+#
5
+# Permission is hereby granted, free of charge, to any person obtaining a copy
6
+# of this software and associated documentation files (the "Software"), to deal
7
+# in the Software without restriction, including without limitation the rights
8
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+# copies of the Software, and to permit persons to whom the Software is
10
+# furnished to do so, subject to the following conditions:
11
+#
12
+# The above copyright notice and this permission notice shall be included in all
13
+# copies or substantial portions of the Software.
14
+#
15
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+# SOFTWARE.
22
+
23
+from __future__ import absolute_import
24
+
25
+import functools
26
+import itertools
27
+import operator
28
+import sys
29
+import types
30
+
31
+__author__ = "Benjamin Peterson <benjamin@python.org>"
32
+__version__ = "1.10.0"
33
+
34
+
35
+# Useful for very coarse version differentiation.
36
+PY2 = sys.version_info[0] == 2
37
+PY3 = sys.version_info[0] == 3
38
+PY34 = sys.version_info[0:2] >= (3, 4)
39
+
40
+if PY3:
41
+    string_types = str,
42
+    integer_types = int,
43
+    class_types = type,
44
+    text_type = str
45
+    binary_type = bytes
46
+
47
+    MAXSIZE = sys.maxsize
48
+else:
49
+    string_types = basestring,
50
+    integer_types = (int, long)
51
+    class_types = (type, types.ClassType)
52
+    text_type = unicode
53
+    binary_type = str
54
+
55
+    if sys.platform.startswith("java"):
56
+        # Jython always uses 32 bits.
57
+        MAXSIZE = int((1 << 31) - 1)
58
+    else:
59
+        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
60
+        class X(object):
61
+
62
+            def __len__(self):
63
+                return 1 << 31
64
+        try:
65
+            len(X())
66
+        except OverflowError:
67
+            # 32-bit
68
+            MAXSIZE = int((1 << 31) - 1)
69
+        else:
70
+            # 64-bit
71
+            MAXSIZE = int((1 << 63) - 1)
72
+        del X
73
+
74
+
75
+def _add_doc(func, doc):
76
+    """Add documentation to a function."""
77
+    func.__doc__ = doc
78
+
79
+
80
+def _import_module(name):
81
+    """Import module, returning the module after the last dot."""
82
+    __import__(name)
83
+    return sys.modules[name]
84
+
85
+
86
+class _LazyDescr(object):
87
+
88
+    def __init__(self, name):
89
+        self.name = name
90
+
91
+    def __get__(self, obj, tp):
92
+        result = self._resolve()
93
+        setattr(obj, self.name, result)  # Invokes __set__.
94
+        try:
95
+            # This is a bit ugly, but it avoids running this again by
96
+            # removing this descriptor.
97
+            delattr(obj.__class__, self.name)
98
+        except AttributeError:
99
+            pass
100
+        return result
101
+
102
+
103
+class MovedModule(_LazyDescr):
104
+
105
+    def __init__(self, name, old, new=None):
106
+        super(MovedModule, self).__init__(name)
107
+        if PY3:
108
+            if new is None:
109
+                new = name
110
+            self.mod = new
111
+        else:
112
+            self.mod = old
113
+
114
+    def _resolve(self):
115
+        return _import_module(self.mod)
116
+
117
+    def __getattr__(self, attr):
118
+        _module = self._resolve()
119
+        value = getattr(_module, attr)
120
+        setattr(self, attr, value)
121
+        return value
122
+
123
+
124
+class _LazyModule(types.ModuleType):
125
+
126
+    def __init__(self, name):
127
+        super(_LazyModule, self).__init__(name)
128
+        self.__doc__ = self.__class__.__doc__
129
+
130
+    def __dir__(self):
131
+        attrs = ["__doc__", "__name__"]
132
+        attrs += [attr.name for attr in self._moved_attributes]
133
+        return attrs
134
+
135
+    # Subclasses should override this
136
+    _moved_attributes = []
137
+
138
+
139
+class MovedAttribute(_LazyDescr):
140
+
141
+    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
142
+        super(MovedAttribute, self).__init__(name)
143
+        if PY3:
144
+            if new_mod is None:
145
+                new_mod = name
146
+            self.mod = new_mod
147
+            if new_attr is None:
148
+                if old_attr is None:
149
+                    new_attr = name
150
+                else:
151
+                    new_attr = old_attr
152
+            self.attr = new_attr
153
+        else:
154
+            self.mod = old_mod
155
+            if old_attr is None:
156
+                old_attr = name
157
+            self.attr = old_attr
158
+
159
+    def _resolve(self):
160
+        module = _import_module(self.mod)
161
+        return getattr(module, self.attr)
162
+
163
+
164
+class _SixMetaPathImporter(object):
165
+
166
+    """
167
+    A meta path importer to import six.moves and its submodules.
168
+
169
+    This class implements a PEP302 finder and loader. It should be compatible
170
+    with Python 2.5 and all existing versions of Python3
171
+    """
172
+
173
+    def __init__(self, six_module_name):
174
+        self.name = six_module_name
175
+        self.known_modules = {}
176
+
177
+    def _add_module(self, mod, *fullnames):
178
+        for fullname in fullnames:
179
+            self.known_modules[self.name + "." + fullname] = mod
180
+
181
+    def _get_module(self, fullname):
182
+        return self.known_modules[self.name + "." + fullname]
183
+
184
+    def find_module(self, fullname, path=None):
185
+        if fullname in self.known_modules:
186
+            return self
187
+        return None
188
+
189
+    def __get_module(self, fullname):
190
+        try:
191
+            return self.known_modules[fullname]
192
+        except KeyError:
193
+            raise ImportError("This loader does not know module " + fullname)
194
+
195
+    def load_module(self, fullname):
196
+        try:
197
+            # in case of a reload
198
+            return sys.modules[fullname]
199
+        except KeyError:
200
+            pass
201
+        mod = self.__get_module(fullname)
202
+        if isinstance(mod, MovedModule):
203
+            mod = mod._resolve()
204
+        else:
205
+            mod.__loader__ = self
206
+        sys.modules[fullname] = mod
207
+        return mod
208
+
209
+    def is_package(self, fullname):
210
+        """
211
+        Return true, if the named module is a package.
212
+
213
+        We need this method to get correct spec objects with
214
+        Python 3.4 (see PEP451)
215
+        """
216
+        return hasattr(self.__get_module(fullname), "__path__")
217
+
218
+    def get_code(self, fullname):
219
+        """Return None
220
+
221
+        Required, if is_package is implemented"""
222
+        self.__get_module(fullname)  # eventually raises ImportError
223
+        return None
224
+    get_source = get_code  # same as get_code
225
+
226
+_importer = _SixMetaPathImporter(__name__)
227
+
228
+
229
+class _MovedItems(_LazyModule):
230
+
231
+    """Lazy loading of moved objects"""
232
+    __path__ = []  # mark as package
233
+
234
+
235
+_moved_attributes = [
236
+    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
237
+    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
238
+    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
239
+    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
240
+    MovedAttribute("intern", "__builtin__", "sys"),
241
+    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
242
+    MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
243
+    MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
244
+    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
245
+    MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
246
+    MovedAttribute("reduce", "__builtin__", "functools"),
247
+    MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
248
+    MovedAttribute("StringIO", "StringIO", "io"),
249
+    MovedAttribute("UserDict", "UserDict", "collections"),
250
+    MovedAttribute("UserList", "UserList", "collections"),
251
+    MovedAttribute("UserString", "UserString", "collections"),
252
+    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
253
+    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
254
+    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
255
+    MovedModule("builtins", "__builtin__"),
256
+    MovedModule("configparser", "ConfigParser"),
257
+    MovedModule("copyreg", "copy_reg"),
258
+    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
259
+    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
260
+    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
261
+    MovedModule("http_cookies", "Cookie", "http.cookies"),
262
+    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
263
+    MovedModule("html_parser", "HTMLParser", "html.parser"),
264
+    MovedModule("http_client", "httplib", "http.client"),
265
+    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
266
+    MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
267
+    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
268
+    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
269
+    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
270
+    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
271
+    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
272
+    MovedModule("cPickle", "cPickle", "pickle"),
273
+    MovedModule("queue", "Queue"),
274
+    MovedModule("reprlib", "repr"),
275
+    MovedModule("socketserver", "SocketServer"),
276
+    MovedModule("_thread", "thread", "_thread"),
277
+    MovedModule("tkinter", "Tkinter"),
278
+    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
279
+    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
280
+    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
281
+    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
282
+    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
283
+    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
284
+    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
285
+    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
286
+    MovedModule("tkinter_colorchooser", "tkColorChooser",
287
+                "tkinter.colorchooser"),
288
+    MovedModule("tkinter_commondialog", "tkCommonDialog",
289
+                "tkinter.commondialog"),
290
+    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
291
+    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
292
+    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
293
+    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
294
+                "tkinter.simpledialog"),
295
+    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
296
+    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
297
+    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
298
+    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
299
+    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
300
+    MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
301
+]
302
+# Add windows specific modules.
303
+if sys.platform == "win32":
304
+    _moved_attributes += [
305
+        MovedModule("winreg", "_winreg"),
306
+    ]
307
+
308
+for attr in _moved_attributes:
309
+    setattr(_MovedItems, attr.name, attr)
310
+    if isinstance(attr, MovedModule):
311
+        _importer._add_module(attr, "moves." + attr.name)
312
+del attr
313
+
314
+_MovedItems._moved_attributes = _moved_attributes
315
+
316
+moves = _MovedItems(__name__ + ".moves")
317
+_importer._add_module(moves, "moves")
318
+
319
+
320
+class Module_six_moves_urllib_parse(_LazyModule):
321
+
322
+    """Lazy loading of moved objects in six.moves.urllib_parse"""
323
+
324
+
325
+_urllib_parse_moved_attributes = [
326
+    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
327
+    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
328
+    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
329
+    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
330
+    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
331
+    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
332
+    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
333
+    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
334
+    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
335
+    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
336
+    MovedAttribute("quote", "urllib", "urllib.parse"),
337
+    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
338
+    MovedAttribute("unquote", "urllib", "urllib.parse"),
339
+    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
340
+    MovedAttribute("urlencode", "urllib", "urllib.parse"),
341
+    MovedAttribute("splitquery", "urllib", "urllib.parse"),
342
+    MovedAttribute("splittag", "urllib", "urllib.parse"),
343
+    MovedAttribute("splituser", "urllib", "urllib.parse"),
344
+    MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
345
+    MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
346
+    MovedAttribute("uses_params", "urlparse", "urllib.parse"),
347
+    MovedAttribute("uses_query", "urlparse", "urllib.parse"),
348
+    MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
349
+]
350
+for attr in _urllib_parse_moved_attributes:
351
+    setattr(Module_six_moves_urllib_parse, attr.name, attr)
352
+del attr
353
+
354
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
355
+
356
+_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
357
+                      "moves.urllib_parse", "moves.urllib.parse")
358
+
359
+
360
+class Module_six_moves_urllib_error(_LazyModule):
361
+
362
+    """Lazy loading of moved objects in six.moves.urllib_error"""
363
+
364
+
365
+_urllib_error_moved_attributes = [
366
+    MovedAttribute("URLError", "urllib2", "urllib.error"),
367
+    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
368
+    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
369
+]
370
+for attr in _urllib_error_moved_attributes:
371
+    setattr(Module_six_moves_urllib_error, attr.name, attr)
372
+del attr
373
+
374
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
375
+
376
+_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
377
+                      "moves.urllib_error", "moves.urllib.error")
378
+
379
+
380
+class Module_six_moves_urllib_request(_LazyModule):
381
+
382
+    """Lazy loading of moved objects in six.moves.urllib_request"""
383
+
384
+
385
+_urllib_request_moved_attributes = [
386
+    MovedAttribute("urlopen", "urllib2", "urllib.request"),
387
+    MovedAttribute("install_opener", "urllib2", "urllib.request"),
388
+    MovedAttribute("build_opener", "urllib2", "urllib.request"),
389
+    MovedAttribute("pathname2url", "urllib", "urllib.request"),
390
+    MovedAttribute("url2pathname", "urllib", "urllib.request"),
391
+    MovedAttribute("getproxies", "urllib", "urllib.request"),
392
+    MovedAttribute("Request", "urllib2", "urllib.request"),
393
+    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
394
+    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
395
+    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
396
+    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
397
+    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
398
+    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
399
+    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
400
+    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
401
+    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
402
+    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
403
+    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
404
+    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
405
+    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
406
+    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
407
+    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
408
+    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
409
+    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
410
+    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
411
+    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
412
+    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
413
+    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
414
+    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
415
+    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
416
+    MovedAttribute("URLopener", "urllib", "urllib.request"),
417
+    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
418
+    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
419
+]
420
+for attr in _urllib_request_moved_attributes:
421
+    setattr(Module_six_moves_urllib_request, attr.name, attr)
422
+del attr
423
+
424
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
425
+
426
+_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
427
+                      "moves.urllib_request", "moves.urllib.request")
428
+
429
+
430
+class Module_six_moves_urllib_response(_LazyModule):
431
+
432
+    """Lazy loading of moved objects in six.moves.urllib_response"""
433
+
434
+
435
+_urllib_response_moved_attributes = [
436
+    MovedAttribute("addbase", "urllib", "urllib.response"),
437
+    MovedAttribute("addclosehook", "urllib", "urllib.response"),
438
+    MovedAttribute("addinfo", "urllib", "urllib.response"),
439
+    MovedAttribute("addinfourl", "urllib", "urllib.response"),
440
+]
441
+for attr in _urllib_response_moved_attributes:
442
+    setattr(Module_six_moves_urllib_response, attr.name, attr)
443
+del attr
444
+
445
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
446
+
447
+_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
448
+                      "moves.urllib_response", "moves.urllib.response")
449
+
450
+
451
+class Module_six_moves_urllib_robotparser(_LazyModule):
452
+
453
+    """Lazy loading of moved objects in six.moves.urllib_robotparser"""
454
+
455
+
456
+_urllib_robotparser_moved_attributes = [
457
+    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
458
+]
459
+for attr in _urllib_robotparser_moved_attributes:
460
+    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
461
+del attr
462
+
463
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
464
+
465
+_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
466
+                      "moves.urllib_robotparser", "moves.urllib.robotparser")
467
+
468
+
469
+class Module_six_moves_urllib(types.ModuleType):
470
+
471
+    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
472
+    __path__ = []  # mark as package
473
+    parse = _importer._get_module("moves.urllib_parse")
474
+    error = _importer._get_module("moves.urllib_error")
475
+    request = _importer._get_module("moves.urllib_request")
476
+    response = _importer._get_module("moves.urllib_response")
477
+    robotparser = _importer._get_module("moves.urllib_robotparser")
478
+
479
+    def __dir__(self):
480
+        return ['parse', 'error', 'request', 'response', 'robotparser']
481
+
482
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
483
+                      "moves.urllib")
484
+
485
+
486
+def add_move(move):
487
+    """Add an item to six.moves."""
488
+    setattr(_MovedItems, move.name, move)
489
+
490
+
491
+def remove_move(name):
492
+    """Remove item from six.moves."""
493
+    try:
494
+        delattr(_MovedItems, name)
495
+    except AttributeError:
496
+        try:
497
+            del moves.__dict__[name]
498
+        except KeyError:
499
+            raise AttributeError("no such move, %r" % (name,))
500
+
501
+
502
+if PY3:
503
+    _meth_func = "__func__"
504
+    _meth_self = "__self__"
505
+
506
+    _func_closure = "__closure__"
507
+    _func_code = "__code__"
508
+    _func_defaults = "__defaults__"
509
+    _func_globals = "__globals__"
510
+else:
511
+    _meth_func = "im_func"
512
+    _meth_self = "im_self"
513
+
514
+    _func_closure = "func_closure"
515
+    _func_code = "func_code"
516
+    _func_defaults = "func_defaults"
517
+    _func_globals = "func_globals"
518
+
519
+
520
+try:
521
+    advance_iterator = next
522
+except NameError:
523
+    def advance_iterator(it):
524
+        return it.next()
525
+next = advance_iterator
526
+
527
+
528
+try:
529
+    callable = callable
530
+except NameError:
531
+    def callable(obj):
532
+        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
533
+
534
+
535
+if PY3:
536
+    def get_unbound_function(unbound):
537
+        return unbound
538
+
539
+    create_bound_method = types.MethodType
540
+
541
+    def create_unbound_method(func, cls):
542
+        return func
543
+
544
+    Iterator = object
545
+else:
546
+    def get_unbound_function(unbound):
547
+        return unbound.im_func
548
+
549
+    def create_bound_method(func, obj):
550
+        return types.MethodType(func, obj, obj.__class__)
551
+
552
+    def create_unbound_method(func, cls):
553
+        return types.MethodType(func, None, cls)
554
+
555
+    class Iterator(object):
556
+
557
+        def next(self):
558
+            return type(self).__next__(self)
559
+
560
+    callable = callable
561
+_add_doc(get_unbound_function,
562
+         """Get the function out of a possibly unbound function""")
563
+
564
+
565
+get_method_function = operator.attrgetter(_meth_func)
566
+get_method_self = operator.attrgetter(_meth_self)
567
+get_function_closure = operator.attrgetter(_func_closure)
568
+get_function_code = operator.attrgetter(_func_code)
569
+get_function_defaults = operator.attrgetter(_func_defaults)
570
+get_function_globals = operator.attrgetter(_func_globals)
571
+
572
+
573
+if PY3:
574
+    def iterkeys(d, **kw):
575
+        return iter(d.keys(**kw))
576
+
577
+    def itervalues(d, **kw):
578
+        return iter(d.values(**kw))
579
+
580
+    def iteritems(d, **kw):
581
+        return iter(d.items(**kw))
582
+
583
+    def iterlists(d, **kw):
584
+        return iter(d.lists(**kw))
585
+
586
+    viewkeys = operator.methodcaller("keys")
587
+
588
+    viewvalues = operator.methodcaller("values")
589
+
590
+    viewitems = operator.methodcaller("items")
591
+else:
592
+    def iterkeys(d, **kw):
593
+        return d.iterkeys(**kw)
594
+
595
+    def itervalues(d, **kw):
596
+        return d.itervalues(**kw)
597
+
598
+    def iteritems(d, **kw):
599
+        return d.iteritems(**kw)
600
+
601
+    def iterlists(d, **kw):
602
+        return d.iterlists(**kw)
603
+
604
+    viewkeys = operator.methodcaller("viewkeys")
605
+
606
+    viewvalues = operator.methodcaller("viewvalues")
607
+
608
+    viewitems = operator.methodcaller("viewitems")
609
+
610
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
611
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
612
+_add_doc(iteritems,
613
+         "Return an iterator over the (key, value) pairs of a dictionary.")
614
+_add_doc(iterlists,
615
+         "Return an iterator over the (key, [values]) pairs of a dictionary.")
616
+
617
+
618
+if PY3:
619
+    def b(s):
620
+        return s.encode("latin-1")
621
+
622
+    def u(s):
623
+        return s
624
+    unichr = chr
625
+    import struct
626
+    int2byte = struct.Struct(">B").pack
627
+    del struct
628
+    byte2int = operator.itemgetter(0)
629
+    indexbytes = operator.getitem
630
+    iterbytes = iter
631
+    import io
632
+    StringIO = io.StringIO
633
+    BytesIO = io.BytesIO
634
+    _assertCountEqual = "assertCountEqual"
635
+    if sys.version_info[1] <= 1:
636
+        _assertRaisesRegex = "assertRaisesRegexp"
637
+        _assertRegex = "assertRegexpMatches"
638
+    else:
639
+        _assertRaisesRegex = "assertRaisesRegex"
640
+        _assertRegex = "assertRegex"
641
+else:
642
+    def b(s):
643
+        return s
644
+    # Workaround for standalone backslash
645
+
646
+    def u(s):
647
+        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
648
+    unichr = unichr
649
+    int2byte = chr
650
+
651
+    def byte2int(bs):
652
+        return ord(bs[0])
653
+
654
+    def indexbytes(buf, i):
655
+        return ord(buf[i])
656
+    iterbytes = functools.partial(itertools.imap, ord)
657
+    import StringIO
658
+    StringIO = BytesIO = StringIO.StringIO
659
+    _assertCountEqual = "assertItemsEqual"
660
+    _assertRaisesRegex = "assertRaisesRegexp"
661
+    _assertRegex = "assertRegexpMatches"
662
+_add_doc(b, """Byte literal""")
663
+_add_doc(u, """Text literal""")
664
+
665
+
666
+def assertCountEqual(self, *args, **kwargs):
667
+    return getattr(self, _assertCountEqual)(*args, **kwargs)
668
+
669
+
670
+def assertRaisesRegex(self, *args, **kwargs):
671
+    return getattr(self, _assertRaisesRegex)(*args, **kwargs)
672
+
673
+
674
+def assertRegex(self, *args, **kwargs):
675
+    return getattr(self, _assertRegex)(*args, **kwargs)
676
+
677
+
678
+if PY3:
679
+    exec_ = getattr(moves.builtins, "exec")
680
+
681
+    def reraise(tp, value, tb=None):
682
+        if value is None:
683
+            value = tp()
684
+        if value.__traceback__ is not tb:
685
+            raise value.with_traceback(tb)
686
+        raise value
687
+
688
+else:
689
+    def exec_(_code_, _globs_=None, _locs_=None):
690
+        """Execute code in a namespace."""
691
+        if _globs_ is None:
692
+            frame = sys._getframe(1)
693
+            _globs_ = frame.f_globals
694
+            if _locs_ is None:
695
+                _locs_ = frame.f_locals
696
+            del frame
697
+        elif _locs_ is None:
698
+            _locs_ = _globs_
699
+        exec("""exec _code_ in _globs_, _locs_""")
700
+
701
+    exec_("""def reraise(tp, value, tb=None):
702
+    raise tp, value, tb
703
+""")
704
+
705
+
706
+if sys.version_info[:2] == (3, 2):
707
+    exec_("""def raise_from(value, from_value):
708
+    if from_value is None:
709
+        raise value
710
+    raise value from from_value
711
+""")
712
+elif sys.version_info[:2] > (3, 2):
713
+    exec_("""def raise_from(value, from_value):
714
+    raise value from from_value
715
+""")
716
+else:
717
+    def raise_from(value, from_value):
718
+        raise value
719
+
720
+
721
+print_ = getattr(moves.builtins, "print", None)
722
+if print_ is None:
723
+    def print_(*args, **kwargs):
724
+        """The new-style print function for Python 2.4 and 2.5."""
725
+        fp = kwargs.pop("file", sys.stdout)
726
+        if fp is None:
727
+            return
728
+
729
+        def write(data):
730
+            if not isinstance(data, basestring):
731
+                data = str(data)
732
+            # If the file has an encoding, encode unicode with it.
733
+            if (isinstance(fp, file) and
734
+                    isinstance(data, unicode) and
735
+                    fp.encoding is not None):
736
+                errors = getattr(fp, "errors", None)
737
+                if errors is None:
738
+                    errors = "strict"
739
+                data = data.encode(fp.encoding, errors)
740
+            fp.write(data)
741
+        want_unicode = False
742
+        sep = kwargs.pop("sep", None)
743
+        if sep is not None:
744
+            if isinstance(sep, unicode):
745
+                want_unicode = True
746
+            elif not isinstance(sep, str):
747
+                raise TypeError("sep must be None or a string")
748
+        end = kwargs.pop("end", None)
749
+        if end is not None:
750
+            if isinstance(end, unicode):
751
+                want_unicode = True
752
+            elif not isinstance(end, str):
753
+                raise TypeError("end must be None or a string")
754
+        if kwargs:
755
+            raise TypeError("invalid keyword arguments to print()")
756
+        if not want_unicode:
757
+            for arg in args:
758
+                if isinstance(arg, unicode):
759
+                    want_unicode = True
760
+                    break
761
+        if want_unicode:
762
+            newline = unicode("\n")
763
+            space = unicode(" ")
764
+        else:
765
+            newline = "\n"
766
+            space = " "
767
+        if sep is None:
768
+            sep = space
769
+        if end is None:
770
+            end = newline
771
+        for i, arg in enumerate(args):
772
+            if i:
773
+                write(sep)
774
+            write(arg)
775
+        write(end)
776
+if sys.version_info[:2] < (3, 3):
777
+    _print = print_
778
+
779
+    def print_(*args, **kwargs):
780
+        fp = kwargs.get("file", sys.stdout)
781
+        flush = kwargs.pop("flush", False)
782
+        _print(*args, **kwargs)
783
+        if flush and fp is not None:
784
+            fp.flush()
785
+
786
+_add_doc(reraise, """Reraise an exception.""")
787
+
788
+if sys.version_info[0:2] < (3, 4):
789
+    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
790
+              updated=functools.WRAPPER_UPDATES):
791
+        def wrapper(f):
792
+            f = functools.wraps(wrapped, assigned, updated)(f)
793
+            f.__wrapped__ = wrapped
794
+            return f
795
+        return wrapper
796
+else:
797
+    wraps = functools.wraps
798
+
799
+
800
+def with_metaclass(meta, *bases):
801
+    """Create a base class with a metaclass."""
802
+    # This requires a bit of explanation: the basic idea is to make a dummy
803
+    # metaclass for one level of class instantiation that replaces itself with
804
+    # the actual metaclass.
805
+    class metaclass(meta):
806
+
807
+        def __new__(cls, name, this_bases, d):
808
+            return meta(name, bases, d)
809
+    return type.__new__(metaclass, 'temporary_class', (), {})
810
+
811
+
812
+def add_metaclass(metaclass):
813
+    """Class decorator for creating a class with a metaclass."""
814
+    def wrapper(cls):
815
+        orig_vars = cls.__dict__.copy()
816
+        slots = orig_vars.get('__slots__')
817
+        if slots is not None:
818
+            if isinstance(slots, str):
819
+                slots = [slots]
820
+            for slots_var in slots:
821
+                orig_vars.pop(slots_var)
822
+        orig_vars.pop('__dict__', None)
823
+        orig_vars.pop('__weakref__', None)
824
+        return metaclass(cls.__name__, cls.__bases__, orig_vars)
825
+    return wrapper
826
+
827
+
828
+def python_2_unicode_compatible(klass):
829
+    """
830
+    A decorator that defines __unicode__ and __str__ methods under Python 2.
831
+    Under Python 3 it does nothing.
832
+
833
+    To support Python 2 and 3 with a single code base, define a __str__ method
834
+    returning text and apply this decorator to the class.
835
+    """
836
+    if PY2:
837
+        if '__str__' not in klass.__dict__:
838
+            raise ValueError("@python_2_unicode_compatible cannot be applied "
839
+                             "to %s because it doesn't define __str__()." %
840
+                             klass.__name__)
841
+        klass.__unicode__ = klass.__str__
842
+        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
843
+    return klass
844
+
845
+
846
+# Complete the moves implementation.
847
+# This code is at the end of this module to speed up module loading.
848
+# Turn this module into a package.
849
+__path__ = []  # required for PEP 302 and PEP 451
850
+__package__ = __name__  # see PEP 366 @ReservedAssignment
851
+if globals().get("__spec__") is not None:
852
+    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
853
+# Remove other six meta path importers, since they cause problems. This can
854
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
855
+# this for some reason.)
856
+if sys.meta_path:
857
+    for i, importer in enumerate(sys.meta_path):
858
+        # Here's some real nastiness: Another "instance" of the six module might
859
+        # be floating around. Therefore, we can't use isinstance() to check for
860
+        # the six meta path importer, since the other six instance will have
861
+        # inserted an importer with different class.
862
+        if (type(importer).__name__ == "_SixMetaPathImporter" and
863
+                importer.name == __name__):
864
+            del sys.meta_path[i]
865
+            break
866
+    del i, importer
867
+# Finally, add the importer to the meta path import hook.
868
+sys.meta_path.append(_importer)

+ 13
- 0
Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py View File

1
+try:
2
+    # Python 3.2+
3
+    from ssl import CertificateError, match_hostname
4
+except ImportError:
5
+    try:
6
+        # Backport of the function from a pypi module
7
+        from backports.ssl_match_hostname import CertificateError, match_hostname
8
+    except ImportError:
9
+        # Our vendored copy
10
+        from ._implementation import CertificateError, match_hostname
11
+
12
+# Not needed, but documenting what we provide.
13
+__all__ = ('CertificateError', 'match_hostname')

+ 105
- 0
Contents/Libraries/Shared/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py View File

1
+"""The match_hostname() function from Python 3.3.3, essential when using SSL."""
2
+
3
+# Note: This file is under the PSF license as the code comes from the python
4
+# stdlib.   http://docs.python.org/3/license.html
5
+
6
+import re
7
+
8
+__version__ = '3.4.0.2'
9
+
10
+class CertificateError(ValueError):
11
+    pass
12
+
13
+
14
+def _dnsname_match(dn, hostname, max_wildcards=1):
15
+    """Matching according to RFC 6125, section 6.4.3
16
+
17
+    http://tools.ietf.org/html/rfc6125#section-6.4.3
18
+    """
19
+    pats = []
20
+    if not dn:
21
+        return False
22
+
23
+    # Ported from python3-syntax:
24
+    # leftmost, *remainder = dn.split(r'.')
25
+    parts = dn.split(r'.')
26
+    leftmost = parts[0]
27
+    remainder = parts[1:]
28
+
29
+    wildcards = leftmost.count('*')
30
+    if wildcards > max_wildcards:
31
+        # Issue #17980: avoid denials of service by refusing more
32
+        # than one wildcard per fragment.  A survey of established
33
+        # policy among SSL implementations showed it to be a
34
+        # reasonable choice.
35
+        raise CertificateError(
36
+            "too many wildcards in certificate DNS name: " + repr(dn))
37
+
38
+    # speed up common case w/o wildcards
39
+    if not wildcards:
40
+        return dn.lower() == hostname.lower()
41
+
42
+    # RFC 6125, section 6.4.3, subitem 1.
43
+    # The client SHOULD NOT attempt to match a presented identifier in which
44
+    # the wildcard character comprises a label other than the left-most label.
45
+    if leftmost == '*':
46
+        # When '*' is a fragment by itself, it matches a non-empty dotless
47
+        # fragment.
48
+        pats.append('[^.]+')
49
+    elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
50
+        # RFC 6125, section 6.4.3, subitem 3.
51
+        # The client SHOULD NOT attempt to match a presented identifier
52
+        # where the wildcard character is embedded within an A-label or
53
+        # U-label of an internationalized domain name.
54
+        pats.append(re.escape(leftmost))
55
+    else:
56
+        # Otherwise, '*' matches any dotless string, e.g. www*
57
+        pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
58
+
59
+    # add the remaining fragments, ignore any wildcards
60
+    for frag in remainder:
61
+        pats.append(re.escape(frag))
62
+
63
+    pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
64
+    return pat.match(hostname)
65
+
66
+
67
+def match_hostname(cert, hostname):
68
+    """Verify that *cert* (in decoded format as returned by
69
+    SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
70
+    rules are followed, but IP addresses are not accepted for *hostname*.
71
+
72
+    CertificateError is raised on failure. On success, the function
73
+    returns nothing.
74
+    """
75
+    if not cert:
76
+        raise ValueError("empty or no certificate")
77
+    dnsnames = []
78
+    san = cert.get('subjectAltName', ())
79
+    for key, value in san:
80
+        if key == 'DNS':
81
+            if _dnsname_match(value, hostname):
82
+                return
83
+            dnsnames.append(value)
84
+    if not dnsnames:
85
+        # The subject is only checked when there is no dNSName entry
86
+        # in subjectAltName
87
+        for sub in cert.get('subject', ()):
88
+            for key, value in sub:
89
+                # XXX according to RFC 2818, the most specific Common Name
90
+                # must be used.
91
+                if key == 'commonName':
92
+                    if _dnsname_match(value, hostname):
93
+                        return
94
+                    dnsnames.append(value)
95
+    if len(dnsnames) > 1:
96
+        raise CertificateError("hostname %r "
97
+            "doesn't match either of %s"
98
+            % (hostname, ', '.join(map(repr, dnsnames))))
99
+    elif len(dnsnames) == 1:
100
+        raise CertificateError("hostname %r "
101
+            "doesn't match %r"
102
+            % (hostname, dnsnames[0]))
103
+    else:
104
+        raise CertificateError("no appropriate commonName or "
105
+            "subjectAltName fields were found")

+ 367
- 0
Contents/Libraries/Shared/requests/packages/urllib3/poolmanager.py View File

1
+from __future__ import absolute_import
2
+import collections
3
+import functools
4
+import logging
5
+
6
+try:  # Python 3
7
+    from urllib.parse import urljoin
8
+except ImportError:
9
+    from urlparse import urljoin
10
+
11
+from ._collections import RecentlyUsedContainer
12
+from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool
13
+from .connectionpool import port_by_scheme
14
+from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown
15
+from .request import RequestMethods
16
+from .util.url import parse_url
17
+from .util.retry import Retry
18
+
19
+
20
+__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url']
21
+
22
+
23
+log = logging.getLogger(__name__)
24
+
25
+SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs',
26
+                'ssl_version', 'ca_cert_dir')
27
+
28
+# The base fields to use when determining what pool to get a connection from;
29
+# these do not rely on the ``connection_pool_kw`` and can be determined by the
30
+# URL and potentially the ``urllib3.connection.port_by_scheme`` dictionary.
31
+#
32
+# All custom key schemes should include the fields in this key at a minimum.
33
+BasePoolKey = collections.namedtuple('BasePoolKey', ('scheme', 'host', 'port'))
34
+
35
+# The fields to use when determining what pool to get a HTTP and HTTPS
36
+# connection from. All additional fields must be present in the PoolManager's
37
+# ``connection_pool_kw`` instance variable.
38
+HTTPPoolKey = collections.namedtuple(
39
+    'HTTPPoolKey', BasePoolKey._fields + ('timeout', 'retries', 'strict',
40
+                                          'block', 'source_address')
41
+)
42
+HTTPSPoolKey = collections.namedtuple(
43
+    'HTTPSPoolKey', HTTPPoolKey._fields + SSL_KEYWORDS
44
+)
45
+
46
+
47
+def _default_key_normalizer(key_class, request_context):
48
+    """
49
+    Create a pool key of type ``key_class`` for a request.
50
+
51
+    According to RFC 3986, both the scheme and host are case-insensitive.
52
+    Therefore, this function normalizes both before constructing the pool
53
+    key for an HTTPS request. If you wish to change this behaviour, provide
54
+    alternate callables to ``key_fn_by_scheme``.
55
+
56
+    :param key_class:
57
+        The class to use when constructing the key. This should be a namedtuple
58
+        with the ``scheme`` and ``host`` keys at a minimum.
59
+
60
+    :param request_context:
61
+        A dictionary-like object that contain the context for a request.
62
+        It should contain a key for each field in the :class:`HTTPPoolKey`
63
+    """
64
+    context = {}
65
+    for key in key_class._fields:
66
+        context[key] = request_context.get(key)
67
+    context['scheme'] = context['scheme'].lower()
68
+    context['host'] = context['host'].lower()
69
+    return key_class(**context)
70
+
71
+
72
+# A dictionary that maps a scheme to a callable that creates a pool key.
73
+# This can be used to alter the way pool keys are constructed, if desired.
74
+# Each PoolManager makes a copy of this dictionary so they can be configured
75
+# globally here, or individually on the instance.
76
+key_fn_by_scheme = {
77
+    'http': functools.partial(_default_key_normalizer, HTTPPoolKey),
78
+    'https': functools.partial(_default_key_normalizer, HTTPSPoolKey),
79
+}
80
+
81
+pool_classes_by_scheme = {
82
+    'http': HTTPConnectionPool,
83
+    'https': HTTPSConnectionPool,
84
+}
85
+
86
+
87
+class PoolManager(RequestMethods):
88
+    """
89
+    Allows for arbitrary requests while transparently keeping track of
90
+    necessary connection pools for you.
91
+
92
+    :param num_pools:
93
+        Number of connection pools to cache before discarding the least
94
+        recently used pool.
95
+
96
+    :param headers:
97
+        Headers to include with all requests, unless other headers are given
98
+        explicitly.
99
+
100
+    :param \**connection_pool_kw:
101
+        Additional parameters are used to create fresh
102
+        :class:`urllib3.connectionpool.ConnectionPool` instances.
103
+
104
+    Example::
105
+
106
+        >>> manager = PoolManager(num_pools=2)
107
+        >>> r = manager.request('GET', 'http://google.com/')
108
+        >>> r = manager.request('GET', 'http://google.com/mail')
109
+        >>> r = manager.request('GET', 'http://yahoo.com/')
110
+        >>> len(manager.pools)
111
+        2
112
+
113
+    """
114
+
115
+    proxy = None
116
+
117
+    def __init__(self, num_pools=10, headers=None, **connection_pool_kw):
118
+        RequestMethods.__init__(self, headers)
119
+        self.connection_pool_kw = connection_pool_kw
120
+        self.pools = RecentlyUsedContainer(num_pools,
121
+                                           dispose_func=lambda p: p.close())
122
+
123
+        # Locally set the pool classes and keys so other PoolManagers can
124
+        # override them.
125
+        self.pool_classes_by_scheme = pool_classes_by_scheme
126
+        self.key_fn_by_scheme = key_fn_by_scheme.copy()
127
+
128
+    def __enter__(self):
129
+        return self
130
+
131
+    def __exit__(self, exc_type, exc_val, exc_tb):
132
+        self.clear()
133
+        # Return False to re-raise any potential exceptions
134
+        return False
135
+
136
+    def _new_pool(self, scheme, host, port):
137
+        """
138
+        Create a new :class:`ConnectionPool` based on host, port and scheme.
139
+
140
+        This method is used to actually create the connection pools handed out
141
+        by :meth:`connection_from_url` and companion methods. It is intended
142
+        to be overridden for customization.
143
+        """
144
+        pool_cls = self.pool_classes_by_scheme[scheme]
145
+        kwargs = self.connection_pool_kw
146
+        if scheme == 'http':
147
+            kwargs = self.connection_pool_kw.copy()
148
+            for kw in SSL_KEYWORDS:
149
+                kwargs.pop(kw, None)
150
+
151
+        return pool_cls(host, port, **kwargs)
152
+
153
+    def clear(self):
154
+        """
155
+        Empty our store of pools and direct them all to close.
156
+
157
+        This will not affect in-flight connections, but they will not be
158
+        re-used after completion.
159
+        """
160
+        self.pools.clear()
161
+
162
+    def connection_from_host(self, host, port=None, scheme='http'):
163
+        """
164
+        Get a :class:`ConnectionPool` based on the host, port, and scheme.
165
+
166
+        If ``port`` isn't given, it will be derived from the ``scheme`` using
167
+        ``urllib3.connectionpool.port_by_scheme``.
168
+        """
169
+
170
+        if not host:
171
+            raise LocationValueError("No host specified.")
172
+
173
+        request_context = self.connection_pool_kw.copy()
174
+        request_context['scheme'] = scheme or 'http'
175
+        if not port:
176
+            port = port_by_scheme.get(request_context['scheme'].lower(), 80)
177
+        request_context['port'] = port
178
+        request_context['host'] = host
179
+
180
+        return self.connection_from_context(request_context)
181
+
182
+    def connection_from_context(self, request_context):
183
+        """
184
+        Get a :class:`ConnectionPool` based on the request context.
185
+
186
+        ``request_context`` must at least contain the ``scheme`` key and its
187
+        value must be a key in ``key_fn_by_scheme`` instance variable.
188
+        """
189
+        scheme = request_context['scheme'].lower()
190
+        pool_key_constructor = self.key_fn_by_scheme[scheme]
191
+        pool_key = pool_key_constructor(request_context)
192
+
193
+        return self.connection_from_pool_key(pool_key)
194
+
195
+    def connection_from_pool_key(self, pool_key):
196
+        """
197
+        Get a :class:`ConnectionPool` based on the provided pool key.
198
+
199
+        ``pool_key`` should be a namedtuple that only contains immutable
200
+        objects. At a minimum it must have the ``scheme``, ``host``, and
201
+        ``port`` fields.
202
+        """
203
+        with self.pools.lock:
204
+            # If the scheme, host, or port doesn't match existing open
205
+            # connections, open a new ConnectionPool.
206
+            pool = self.pools.get(pool_key)
207
+            if pool:
208
+                return pool
209
+
210
+            # Make a fresh ConnectionPool of the desired type
211
+            pool = self._new_pool(pool_key.scheme, pool_key.host, pool_key.port)
212
+            self.pools[pool_key] = pool
213
+
214
+        return pool
215
+
216
+    def connection_from_url(self, url):
217
+        """
218
+        Similar to :func:`urllib3.connectionpool.connection_from_url` but
219
+        doesn't pass any additional parameters to the
220
+        :class:`urllib3.connectionpool.ConnectionPool` constructor.
221
+
222
+        Additional parameters are taken from the :class:`.PoolManager`
223
+        constructor.
224
+        """
225
+        u = parse_url(url)
226
+        return self.connection_from_host(u.host, port=u.port, scheme=u.scheme)
227
+
228
+    def urlopen(self, method, url, redirect=True, **kw):
229
+        """
230
+        Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen`
231
+        with custom cross-host redirect logic and only sends the request-uri
232
+        portion of the ``url``.
233
+
234
+        The given ``url`` parameter must be absolute, such that an appropriate
235
+        :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it.
236
+        """
237
+        u = parse_url(url)
238
+        conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme)
239
+
240
+        kw['assert_same_host'] = False
241
+        kw['redirect'] = False
242
+        if 'headers' not in kw:
243
+            kw['headers'] = self.headers
244
+
245
+        if self.proxy is not None and u.scheme == "http":
246
+            response = conn.urlopen(method, url, **kw)
247
+        else:
248
+            response = conn.urlopen(method, u.request_uri, **kw)
249
+
250
+        redirect_location = redirect and response.get_redirect_location()
251
+        if not redirect_location:
252
+            return response
253
+
254
+        # Support relative URLs for redirecting.
255
+        redirect_location = urljoin(url, redirect_location)
256
+
257
+        # RFC 7231, Section 6.4.4
258
+        if response.status == 303:
259
+            method = 'GET'
260
+
261
+        retries = kw.get('retries')
262
+        if not isinstance(retries, Retry):
263
+            retries = Retry.from_int(retries, redirect=redirect)
264
+
265
+        try:
266
+            retries = retries.increment(method, url, response=response, _pool=conn)
267
+        except MaxRetryError:
268
+            if retries.raise_on_redirect:
269
+                raise
270
+            return response
271
+
272
+        kw['retries'] = retries
273
+        kw['redirect'] = redirect
274
+
275
+        log.info("Redirecting %s -> %s", url, redirect_location)
276
+        return self.urlopen(method, redirect_location, **kw)
277
+
278
+
279
+class ProxyManager(PoolManager):
280
+    """
281
+    Behaves just like :class:`PoolManager`, but sends all requests through
282
+    the defined proxy, using the CONNECT method for HTTPS URLs.
283
+
284
+    :param proxy_url:
285
+        The URL of the proxy to be used.
286
+
287
+    :param proxy_headers:
288
+        A dictionary contaning headers that will be sent to the proxy. In case
289
+        of HTTP they are being sent with each request, while in the
290
+        HTTPS/CONNECT case they are sent only once. Could be used for proxy
291
+        authentication.
292
+
293
+    Example:
294
+        >>> proxy = urllib3.ProxyManager('http://localhost:3128/')
295
+        >>> r1 = proxy.request('GET', 'http://google.com/')
296
+        >>> r2 = proxy.request('GET', 'http://httpbin.org/')
297
+        >>> len(proxy.pools)
298
+        1
299
+        >>> r3 = proxy.request('GET', 'https://httpbin.org/')
300
+        >>> r4 = proxy.request('GET', 'https://twitter.com/')
301
+        >>> len(proxy.pools)
302
+        3
303
+
304
+    """
305
+
306
+    def __init__(self, proxy_url, num_pools=10, headers=None,
307
+                 proxy_headers=None, **connection_pool_kw):
308
+
309
+        if isinstance(proxy_url, HTTPConnectionPool):
310
+            proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host,
311
+                                        proxy_url.port)
312
+        proxy = parse_url(proxy_url)
313
+        if not proxy.port:
314
+            port = port_by_scheme.get(proxy.scheme, 80)
315
+            proxy = proxy._replace(port=port)
316
+
317
+        if proxy.scheme not in ("http", "https"):
318
+            raise ProxySchemeUnknown(proxy.scheme)
319
+
320
+        self.proxy = proxy
321
+        self.proxy_headers = proxy_headers or {}
322
+
323
+        connection_pool_kw['_proxy'] = self.proxy
324
+        connection_pool_kw['_proxy_headers'] = self.proxy_headers
325
+
326
+        super(ProxyManager, self).__init__(
327
+            num_pools, headers, **connection_pool_kw)
328
+
329
+    def connection_from_host(self, host, port=None, scheme='http'):
330
+        if scheme == "https":
331
+            return super(ProxyManager, self).connection_from_host(
332
+                host, port, scheme)
333
+
334
+        return super(ProxyManager, self).connection_from_host(
335
+            self.proxy.host, self.proxy.port, self.proxy.scheme)
336
+
337
+    def _set_proxy_headers(self, url, headers=None):
338
+        """
339
+        Sets headers needed by proxies: specifically, the Accept and Host
340
+        headers. Only sets headers not provided by the user.
341
+        """
342
+        headers_ = {'Accept': '*/*'}
343
+
344
+        netloc = parse_url(url).netloc
345
+        if netloc:
346
+            headers_['Host'] = netloc
347
+
348
+        if headers:
349
+            headers_.update(headers)
350
+        return headers_
351
+
352
+    def urlopen(self, method, url, redirect=True, **kw):
353
+        "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute."
354
+        u = parse_url(url)
355
+
356
+        if u.scheme == "http":
357
+            # For proxied HTTPS requests, httplib sets the necessary headers
358
+            # on the CONNECT to the proxy. For HTTP, we'll definitely
359
+            # need to set 'Host' at the very least.
360
+            headers = kw.get('headers', self.headers)
361
+            kw['headers'] = self._set_proxy_headers(url, headers)
362
+
363
+        return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw)
364
+
365
+
366
+def proxy_from_url(url, **kw):
367
+    return ProxyManager(proxy_url=url, **kw)

+ 151
- 0
Contents/Libraries/Shared/requests/packages/urllib3/request.py View File

1
+from __future__ import absolute_import
2
+try:
3
+    from urllib.parse import urlencode
4
+except ImportError:
5
+    from urllib import urlencode
6
+
7
+from .filepost import encode_multipart_formdata
8
+
9
+
10
+__all__ = ['RequestMethods']
11
+
12
+
13
+class RequestMethods(object):
14
+    """
15
+    Convenience mixin for classes who implement a :meth:`urlopen` method, such
16
+    as :class:`~urllib3.connectionpool.HTTPConnectionPool` and
17
+    :class:`~urllib3.poolmanager.PoolManager`.
18
+
19
+    Provides behavior for making common types of HTTP request methods and
20
+    decides which type of request field encoding to use.
21
+
22
+    Specifically,
23
+
24
+    :meth:`.request_encode_url` is for sending requests whose fields are
25
+    encoded in the URL (such as GET, HEAD, DELETE).
26
+
27
+    :meth:`.request_encode_body` is for sending requests whose fields are
28
+    encoded in the *body* of the request using multipart or www-form-urlencoded
29
+    (such as for POST, PUT, PATCH).
30
+
31
+    :meth:`.request` is for making any kind of request, it will look up the
32
+    appropriate encoding format and use one of the above two methods to make
33
+    the request.
34
+
35
+    Initializer parameters:
36
+
37
+    :param headers:
38
+        Headers to include with all requests, unless other headers are given
39
+        explicitly.
40
+    """
41
+
42
+    _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS'])
43
+
44
+    def __init__(self, headers=None):
45
+        self.headers = headers or {}
46
+
47
+    def urlopen(self, method, url, body=None, headers=None,
48
+                encode_multipart=True, multipart_boundary=None,
49
+                **kw):  # Abstract
50
+        raise NotImplemented("Classes extending RequestMethods must implement "
51
+                             "their own ``urlopen`` method.")
52
+
53
+    def request(self, method, url, fields=None, headers=None, **urlopen_kw):
54
+        """
55
+        Make a request using :meth:`urlopen` with the appropriate encoding of
56
+        ``fields`` based on the ``method`` used.
57
+
58
+        This is a convenience method that requires the least amount of manual
59
+        effort. It can be used in most situations, while still having the
60
+        option to drop down to more specific methods when necessary, such as
61
+        :meth:`request_encode_url`, :meth:`request_encode_body`,
62
+        or even the lowest level :meth:`urlopen`.
63
+        """
64
+        method = method.upper()
65
+
66
+        if method in self._encode_url_methods:
67
+            return self.request_encode_url(method, url, fields=fields,
68
+                                           headers=headers,
69
+                                           **urlopen_kw)
70
+        else:
71
+            return self.request_encode_body(method, url, fields=fields,
72
+                                            headers=headers,
73
+                                            **urlopen_kw)
74
+
75
+    def request_encode_url(self, method, url, fields=None, headers=None,
76
+                           **urlopen_kw):
77
+        """
78
+        Make a request using :meth:`urlopen` with the ``fields`` encoded in
79
+        the url. This is useful for request methods like GET, HEAD, DELETE, etc.
80
+        """
81
+        if headers is None:
82
+            headers = self.headers
83
+
84
+        extra_kw = {'headers': headers}
85
+        extra_kw.update(urlopen_kw)
86
+
87
+        if fields:
88
+            url += '?' + urlencode(fields)
89
+
90
+        return self.urlopen(method, url, **extra_kw)
91
+
92
+    def request_encode_body(self, method, url, fields=None, headers=None,
93
+                            encode_multipart=True, multipart_boundary=None,
94
+                            **urlopen_kw):
95
+        """
96
+        Make a request using :meth:`urlopen` with the ``fields`` encoded in
97
+        the body. This is useful for request methods like POST, PUT, PATCH, etc.
98
+
99
+        When ``encode_multipart=True`` (default), then
100
+        :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode
101
+        the payload with the appropriate content type. Otherwise
102
+        :meth:`urllib.urlencode` is used with the
103
+        'application/x-www-form-urlencoded' content type.
104
+
105
+        Multipart encoding must be used when posting files, and it's reasonably
106
+        safe to use it in other times too. However, it may break request
107
+        signing, such as with OAuth.
108
+
109
+        Supports an optional ``fields`` parameter of key/value strings AND
110
+        key/filetuple. A filetuple is a (filename, data, MIME type) tuple where
111
+        the MIME type is optional. For example::
112
+
113
+            fields = {
114
+                'foo': 'bar',
115
+                'fakefile': ('foofile.txt', 'contents of foofile'),
116
+                'realfile': ('barfile.txt', open('realfile').read()),
117
+                'typedfile': ('bazfile.bin', open('bazfile').read(),
118
+                              'image/jpeg'),
119
+                'nonamefile': 'contents of nonamefile field',
120
+            }
121
+
122
+        When uploading a file, providing a filename (the first parameter of the
123
+        tuple) is optional but recommended to best mimick behavior of browsers.
124
+
125
+        Note that if ``headers`` are supplied, the 'Content-Type' header will
126
+        be overwritten because it depends on the dynamic random boundary string
127
+        which is used to compose the body of the request. The random boundary
128
+        string can be explicitly set with the ``multipart_boundary`` parameter.
129
+        """
130
+        if headers is None:
131
+            headers = self.headers
132
+
133
+        extra_kw = {'headers': {}}
134
+
135
+        if fields:
136
+            if 'body' in urlopen_kw:
137
+                raise TypeError(
138
+                    "request got values for both 'fields' and 'body', can only specify one.")
139
+
140
+            if encode_multipart:
141
+                body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary)
142
+            else:
143
+                body, content_type = urlencode(fields), 'application/x-www-form-urlencoded'
144
+
145
+            extra_kw['body'] = body
146
+            extra_kw['headers'] = {'Content-Type': content_type}
147
+
148
+        extra_kw['headers'].update(headers)
149
+        extra_kw.update(urlopen_kw)
150
+
151
+        return self.urlopen(method, url, **extra_kw)

+ 530
- 0
Contents/Libraries/Shared/requests/packages/urllib3/response.py View File

1
+from __future__ import absolute_import
2
+from contextlib import contextmanager
3
+import zlib
4
+import io
5
+from socket import timeout as SocketTimeout
6
+from socket import error as SocketError
7
+
8
+from ._collections import HTTPHeaderDict
9
+from .exceptions import (
10
+    ProtocolError, DecodeError, ReadTimeoutError, ResponseNotChunked
11
+)
12
+from .packages.six import string_types as basestring, binary_type, PY3
13
+from .packages.six.moves import http_client as httplib
14
+from .connection import HTTPException, BaseSSLError
15
+from .util.response import is_fp_closed, is_response_to_head
16
+
17
+
18
+class DeflateDecoder(object):
19
+
20
+    def __init__(self):
21
+        self._first_try = True
22
+        self._data = binary_type()
23
+        self._obj = zlib.decompressobj()
24
+
25
+    def __getattr__(self, name):
26
+        return getattr(self._obj, name)
27
+
28
+    def decompress(self, data):
29
+        if not data:
30
+            return data
31
+
32
+        if not self._first_try:
33
+            return self._obj.decompress(data)
34
+
35
+        self._data += data
36
+        try:
37
+            return self._obj.decompress(data)
38
+        except zlib.error:
39
+            self._first_try = False
40
+            self._obj = zlib.decompressobj(-zlib.MAX_WBITS)
41
+            try:
42
+                return self.decompress(self._data)
43
+            finally:
44
+                self._data = None
45
+
46
+
47
+class GzipDecoder(object):
48
+
49
+    def __init__(self):
50
+        self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS)
51
+
52
+    def __getattr__(self, name):
53
+        return getattr(self._obj, name)
54
+
55
+    def decompress(self, data):
56
+        if not data:
57
+            return data
58
+        return self._obj.decompress(data)
59
+
60
+
61
+def _get_decoder(mode):
62
+    if mode == 'gzip':
63
+        return GzipDecoder()
64
+
65
+    return DeflateDecoder()
66
+
67
+
68
+class HTTPResponse(io.IOBase):
69
+    """
70
+    HTTP Response container.
71
+
72
+    Backwards-compatible to httplib's HTTPResponse but the response ``body`` is
73
+    loaded and decoded on-demand when the ``data`` property is accessed.  This
74
+    class is also compatible with the Python standard library's :mod:`io`
75
+    module, and can hence be treated as a readable object in the context of that
76
+    framework.
77
+
78
+    Extra parameters for behaviour not present in httplib.HTTPResponse:
79
+
80
+    :param preload_content:
81
+        If True, the response's body will be preloaded during construction.
82
+
83
+    :param decode_content:
84
+        If True, attempts to decode specific content-encoding's based on headers
85
+        (like 'gzip' and 'deflate') will be skipped and raw data will be used
86
+        instead.
87
+
88
+    :param original_response:
89
+        When this HTTPResponse wrapper is generated from an httplib.HTTPResponse
90
+        object, it's convenient to include the original for debug purposes. It's
91
+        otherwise unused.
92
+    """
93
+
94
+    CONTENT_DECODERS = ['gzip', 'deflate']
95
+    REDIRECT_STATUSES = [301, 302, 303, 307, 308]
96
+
97
+    def __init__(self, body='', headers=None, status=0, version=0, reason=None,
98
+                 strict=0, preload_content=True, decode_content=True,
99
+                 original_response=None, pool=None, connection=None):
100
+
101
+        if isinstance(headers, HTTPHeaderDict):
102
+            self.headers = headers
103
+        else:
104
+            self.headers = HTTPHeaderDict(headers)
105
+        self.status = status
106
+        self.version = version
107
+        self.reason = reason
108
+        self.strict = strict
109
+        self.decode_content = decode_content
110
+
111
+        self._decoder = None
112
+        self._body = None
113
+        self._fp = None
114
+        self._original_response = original_response
115
+        self._fp_bytes_read = 0
116
+
117
+        if body and isinstance(body, (basestring, binary_type)):
118
+            self._body = body
119
+
120
+        self._pool = pool
121
+        self._connection = connection
122
+
123
+        if hasattr(body, 'read'):
124
+            self._fp = body
125
+
126
+        # Are we using the chunked-style of transfer encoding?
127
+        self.chunked = False
128
+        self.chunk_left = None
129
+        tr_enc = self.headers.get('transfer-encoding', '').lower()
130
+        # Don't incur the penalty of creating a list and then discarding it
131
+        encodings = (enc.strip() for enc in tr_enc.split(","))
132
+        if "chunked" in encodings:
133
+            self.chunked = True
134
+
135
+        # If requested, preload the body.
136
+        if preload_content and not self._body:
137
+            self._body = self.read(decode_content=decode_content)
138
+
139
+    def get_redirect_location(self):
140
+        """
141
+        Should we redirect and where to?
142
+
143
+        :returns: Truthy redirect location string if we got a redirect status
144
+            code and valid location. ``None`` if redirect status and no
145
+            location. ``False`` if not a redirect status code.
146
+        """
147
+        if self.status in self.REDIRECT_STATUSES:
148
+            return self.headers.get('location')
149
+
150
+        return False
151
+
152
+    def release_conn(self):
153
+        if not self._pool or not self._connection:
154
+            return
155
+
156
+        self._pool._put_conn(self._connection)
157
+        self._connection = None
158
+
159
+    @property
160
+    def data(self):
161
+        # For backwords-compat with earlier urllib3 0.4 and earlier.
162
+        if self._body:
163
+            return self._body
164
+
165
+        if self._fp:
166
+            return self.read(cache_content=True)
167
+
168
+    @property
169
+    def connection(self):
170
+        return self._connection
171
+
172
+    def tell(self):
173
+        """
174
+        Obtain the number of bytes pulled over the wire so far. May differ from
175
+        the amount of content returned by :meth:``HTTPResponse.read`` if bytes
176
+        are encoded on the wire (e.g, compressed).
177
+        """
178
+        return self._fp_bytes_read
179
+
180
+    def _init_decoder(self):
181
+        """
182
+        Set-up the _decoder attribute if necessar.
183
+        """
184
+        # Note: content-encoding value should be case-insensitive, per RFC 7230
185
+        # Section 3.2
186
+        content_encoding = self.headers.get('content-encoding', '').lower()
187
+        if self._decoder is None and content_encoding in self.CONTENT_DECODERS:
188
+            self._decoder = _get_decoder(content_encoding)
189
+
190
+    def _decode(self, data, decode_content, flush_decoder):
191
+        """
192
+        Decode the data passed in and potentially flush the decoder.
193
+        """
194
+        try:
195
+            if decode_content and self._decoder:
196
+                data = self._decoder.decompress(data)
197
+        except (IOError, zlib.error) as e:
198
+            content_encoding = self.headers.get('content-encoding', '').lower()
199
+            raise DecodeError(
200
+                "Received response with content-encoding: %s, but "
201
+                "failed to decode it." % content_encoding, e)
202
+
203
+        if flush_decoder and decode_content:
204
+            data += self._flush_decoder()
205
+
206
+        return data
207
+
208
+    def _flush_decoder(self):
209
+        """
210
+        Flushes the decoder. Should only be called if the decoder is actually
211
+        being used.
212
+        """
213
+        if self._decoder:
214
+            buf = self._decoder.decompress(b'')
215
+            return buf + self._decoder.flush()
216
+
217
+        return b''
218
+
219
+    @contextmanager
220
+    def _error_catcher(self):
221
+        """
222
+        Catch low-level python exceptions, instead re-raising urllib3
223
+        variants, so that low-level exceptions are not leaked in the
224
+        high-level api.
225
+
226
+        On exit, release the connection back to the pool.
227
+        """
228
+        clean_exit = False
229
+
230
+        try:
231
+            try:
232
+                yield
233
+
234
+            except SocketTimeout:
235
+                # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but
236
+                # there is yet no clean way to get at it from this context.
237
+                raise ReadTimeoutError(self._pool, None, 'Read timed out.')
238
+
239
+            except BaseSSLError as e:
240
+                # FIXME: Is there a better way to differentiate between SSLErrors?
241
+                if 'read operation timed out' not in str(e):  # Defensive:
242
+                    # This shouldn't happen but just in case we're missing an edge
243
+                    # case, let's avoid swallowing SSL errors.
244
+                    raise
245
+
246
+                raise ReadTimeoutError(self._pool, None, 'Read timed out.')
247
+
248
+            except (HTTPException, SocketError) as e:
249
+                # This includes IncompleteRead.
250
+                raise ProtocolError('Connection broken: %r' % e, e)
251
+
252
+            # If no exception is thrown, we should avoid cleaning up
253
+            # unnecessarily.
254
+            clean_exit = True
255
+        finally:
256
+            # If we didn't terminate cleanly, we need to throw away our
257
+            # connection.
258
+            if not clean_exit:
259
+                # The response may not be closed but we're not going to use it
260
+                # anymore so close it now to ensure that the connection is
261
+                # released back to the pool.
262
+                if self._original_response:
263
+                    self._original_response.close()
264
+
265
+                # Closing the response may not actually be sufficient to close
266
+                # everything, so if we have a hold of the connection close that
267
+                # too.
268
+                if self._connection:
269
+                    self._connection.close()
270
+
271
+            # If we hold the original response but it's closed now, we should
272
+            # return the connection back to the pool.
273
+            if self._original_response and self._original_response.isclosed():
274
+                self.release_conn()
275
+
276
+    def read(self, amt=None, decode_content=None, cache_content=False):
277
+        """
278
+        Similar to :meth:`httplib.HTTPResponse.read`, but with two additional
279
+        parameters: ``decode_content`` and ``cache_content``.
280
+
281
+        :param amt:
282
+            How much of the content to read. If specified, caching is skipped
283
+            because it doesn't make sense to cache partial content as the full
284
+            response.
285
+
286
+        :param decode_content:
287
+            If True, will attempt to decode the body based on the
288
+            'content-encoding' header.
289
+
290
+        :param cache_content:
291
+            If True, will save the returned data such that the same result is
292
+            returned despite of the state of the underlying file object. This
293
+            is useful if you want the ``.data`` property to continue working
294
+            after having ``.read()`` the file object. (Overridden if ``amt`` is
295
+            set.)
296
+        """
297
+        self._init_decoder()
298
+        if decode_content is None:
299
+            decode_content = self.decode_content
300
+
301
+        if self._fp is None:
302
+            return
303
+
304
+        flush_decoder = False
305
+        data = None
306
+
307
+        with self._error_catcher():
308
+            if amt is None:
309
+                # cStringIO doesn't like amt=None
310
+                data = self._fp.read()
311
+                flush_decoder = True
312
+            else:
313
+                cache_content = False
314
+                data = self._fp.read(amt)
315
+                if amt != 0 and not data:  # Platform-specific: Buggy versions of Python.
316
+                    # Close the connection when no data is returned
317
+                    #
318
+                    # This is redundant to what httplib/http.client _should_
319
+                    # already do.  However, versions of python released before
320
+                    # December 15, 2012 (http://bugs.python.org/issue16298) do
321
+                    # not properly close the connection in all cases. There is
322
+                    # no harm in redundantly calling close.
323
+                    self._fp.close()
324
+                    flush_decoder = True
325
+
326
+        if data:
327
+            self._fp_bytes_read += len(data)
328
+
329
+            data = self._decode(data, decode_content, flush_decoder)
330
+
331
+            if cache_content:
332
+                self._body = data
333
+
334
+        return data
335
+
336
+    def stream(self, amt=2**16, decode_content=None):
337
+        """
338
+        A generator wrapper for the read() method. A call will block until
339
+        ``amt`` bytes have been read from the connection or until the
340
+        connection is closed.
341
+
342
+        :param amt:
343
+            How much of the content to read. The generator will return up to
344
+            much data per iteration, but may return less. This is particularly
345
+            likely when using compressed data. However, the empty string will
346
+            never be returned.
347
+
348
+        :param decode_content:
349
+            If True, will attempt to decode the body based on the
350
+            'content-encoding' header.
351
+        """
352
+        if self.chunked:
353
+            for line in self.read_chunked(amt, decode_content=decode_content):
354
+                yield line
355
+        else:
356
+            while not is_fp_closed(self._fp):
357
+                data = self.read(amt=amt, decode_content=decode_content)
358
+
359
+                if data:
360
+                    yield data
361
+
362
+    @classmethod
363
+    def from_httplib(ResponseCls, r, **response_kw):
364
+        """
365
+        Given an :class:`httplib.HTTPResponse` instance ``r``, return a
366
+        corresponding :class:`urllib3.response.HTTPResponse` object.
367
+
368
+        Remaining parameters are passed to the HTTPResponse constructor, along
369
+        with ``original_response=r``.
370
+        """
371
+        headers = r.msg
372
+
373
+        if not isinstance(headers, HTTPHeaderDict):
374
+            if PY3:  # Python 3
375
+                headers = HTTPHeaderDict(headers.items())
376
+            else:  # Python 2
377
+                headers = HTTPHeaderDict.from_httplib(headers)
378
+
379
+        # HTTPResponse objects in Python 3 don't have a .strict attribute
380
+        strict = getattr(r, 'strict', 0)
381
+        resp = ResponseCls(body=r,
382
+                           headers=headers,
383
+                           status=r.status,
384
+                           version=r.version,
385
+                           reason=r.reason,
386
+                           strict=strict,
387
+                           original_response=r,
388
+                           **response_kw)
389
+        return resp
390
+
391
+    # Backwards-compatibility methods for httplib.HTTPResponse
392
+    def getheaders(self):
393
+        return self.headers
394
+
395
+    def getheader(self, name, default=None):
396
+        return self.headers.get(name, default)
397
+
398
+    # Overrides from io.IOBase
399
+    def close(self):
400
+        if not self.closed:
401
+            self._fp.close()
402
+
403
+        if self._connection:
404
+            self._connection.close()
405
+
406
+    @property
407
+    def closed(self):
408
+        if self._fp is None:
409
+            return True
410
+        elif hasattr(self._fp, 'closed'):
411
+            return self._fp.closed
412
+        elif hasattr(self._fp, 'isclosed'):  # Python 2
413
+            return self._fp.isclosed()
414
+        else:
415
+            return True
416
+
417
+    def fileno(self):
418
+        if self._fp is None:
419
+            raise IOError("HTTPResponse has no file to get a fileno from")
420
+        elif hasattr(self._fp, "fileno"):
421
+            return self._fp.fileno()
422
+        else:
423
+            raise IOError("The file-like object this HTTPResponse is wrapped "
424
+                          "around has no file descriptor")
425
+
426
+    def flush(self):
427
+        if self._fp is not None and hasattr(self._fp, 'flush'):
428
+            return self._fp.flush()
429
+
430
+    def readable(self):
431
+        # This method is required for `io` module compatibility.
432
+        return True
433
+
434
+    def readinto(self, b):
435
+        # This method is required for `io` module compatibility.
436
+        temp = self.read(len(b))
437
+        if len(temp) == 0:
438
+            return 0
439
+        else:
440
+            b[:len(temp)] = temp
441
+            return len(temp)
442
+
443
+    def _update_chunk_length(self):
444
+        # First, we'll figure out length of a chunk and then
445
+        # we'll try to read it from socket.
446
+        if self.chunk_left is not None:
447
+            return
448
+        line = self._fp.fp.readline()
449
+        line = line.split(b';', 1)[0]
450
+        try:
451
+            self.chunk_left = int(line, 16)
452
+        except ValueError:
453
+            # Invalid chunked protocol response, abort.
454
+            self.close()
455
+            raise httplib.IncompleteRead(line)
456
+
457
+    def _handle_chunk(self, amt):
458
+        returned_chunk = None
459
+        if amt is None:
460
+            chunk = self._fp._safe_read(self.chunk_left)
461
+            returned_chunk = chunk
462
+            self._fp._safe_read(2)  # Toss the CRLF at the end of the chunk.
463
+            self.chunk_left = None
464
+        elif amt < self.chunk_left:
465
+            value = self._fp._safe_read(amt)
466
+            self.chunk_left = self.chunk_left - amt
467
+            returned_chunk = value
468
+        elif amt == self.chunk_left:
469
+            value = self._fp._safe_read(amt)
470
+            self._fp._safe_read(2)  # Toss the CRLF at the end of the chunk.
471
+            self.chunk_left = None
472
+            returned_chunk = value
473
+        else:  # amt > self.chunk_left
474
+            returned_chunk = self._fp._safe_read(self.chunk_left)
475
+            self._fp._safe_read(2)  # Toss the CRLF at the end of the chunk.
476
+            self.chunk_left = None
477
+        return returned_chunk
478
+
479
+    def read_chunked(self, amt=None, decode_content=None):
480
+        """
481
+        Similar to :meth:`HTTPResponse.read`, but with an additional
482
+        parameter: ``decode_content``.
483
+
484
+        :param decode_content:
485
+            If True, will attempt to decode the body based on the
486
+            'content-encoding' header.
487
+        """
488
+        self._init_decoder()
489
+        # FIXME: Rewrite this method and make it a class with a better structured logic.
490
+        if not self.chunked:
491
+            raise ResponseNotChunked(
492
+                "Response is not chunked. "
493
+                "Header 'transfer-encoding: chunked' is missing.")
494
+
495
+        # Don't bother reading the body of a HEAD request.
496
+        if self._original_response and is_response_to_head(self._original_response):
497
+            self._original_response.close()
498
+            return
499
+
500
+        with self._error_catcher():
501
+            while True:
502
+                self._update_chunk_length()
503
+                if self.chunk_left == 0:
504
+                    break
505
+                chunk = self._handle_chunk(amt)
506
+                decoded = self._decode(chunk, decode_content=decode_content,
507
+                                       flush_decoder=False)
508
+                if decoded:
509
+                    yield decoded
510
+
511
+            if decode_content:
512
+                # On CPython and PyPy, we should never need to flush the
513
+                # decoder. However, on Jython we *might* need to, so
514
+                # lets defensively do it anyway.
515
+                decoded = self._flush_decoder()
516
+                if decoded:  # Platform-specific: Jython.
517
+                    yield decoded
518
+
519
+            # Chunk content ends with \r\n: discard it.
520
+            while True:
521
+                line = self._fp.fp.readline()
522
+                if not line:
523
+                    # Some sites may not end with '\r\n'.
524
+                    break
525
+                if line == b'\r\n':
526
+                    break
527
+
528
+            # We read everything; close the "file".
529
+            if self._original_response:
530
+                self._original_response.close()

+ 46
- 0
Contents/Libraries/Shared/requests/packages/urllib3/util/__init__.py View File

1
+from __future__ import absolute_import
2
+# For backwards compatibility, provide imports that used to be here.
3
+from .connection import is_connection_dropped
4
+from .request import make_headers
5
+from .response import is_fp_closed
6
+from .ssl_ import (
7
+    SSLContext,
8
+    HAS_SNI,
9
+    IS_PYOPENSSL,
10
+    assert_fingerprint,
11
+    resolve_cert_reqs,
12
+    resolve_ssl_version,
13
+    ssl_wrap_socket,
14
+)
15
+from .timeout import (
16
+    current_time,
17
+    Timeout,
18
+)
19
+
20
+from .retry import Retry
21
+from .url import (
22
+    get_host,
23
+    parse_url,
24
+    split_first,
25
+    Url,
26
+)
27
+
28
+__all__ = (
29
+    'HAS_SNI',
30
+    'IS_PYOPENSSL',
31
+    'SSLContext',
32
+    'Retry',
33
+    'Timeout',
34
+    'Url',
35
+    'assert_fingerprint',
36
+    'current_time',
37
+    'is_connection_dropped',
38
+    'is_fp_closed',
39
+    'get_host',
40
+    'parse_url',
41
+    'make_headers',
42
+    'resolve_cert_reqs',
43
+    'resolve_ssl_version',
44
+    'split_first',
45
+    'ssl_wrap_socket',
46
+)

+ 144
- 0
Contents/Libraries/Shared/requests/packages/urllib3/util/connection.py View File

1
+from __future__ import absolute_import
2
+import socket
3
+try:
4
+    from select import poll, POLLIN
5
+except ImportError:  # `poll` doesn't exist on OSX and other platforms
6
+    poll = False
7
+    try:
8
+        from select import select
9
+    except ImportError:  # `select` doesn't exist on AppEngine.
10
+        select = False
11
+
12
+
13
+def is_connection_dropped(conn):  # Platform-specific
14
+    """
15
+    Returns True if the connection is dropped and should be closed.
16
+
17
+    :param conn:
18
+        :class:`httplib.HTTPConnection` object.
19
+
20
+    Note: For platforms like AppEngine, this will always return ``False`` to
21
+    let the platform handle connection recycling transparently for us.
22
+    """
23
+    sock = getattr(conn, 'sock', False)
24
+    if sock is False:  # Platform-specific: AppEngine
25
+        return False
26
+    if sock is None:  # Connection already closed (such as by httplib).
27
+        return True
28
+
29
+    if not poll:
30
+        if not select:  # Platform-specific: AppEngine
31
+            return False
32
+
33
+        try:
34
+            return select([sock], [], [], 0.0)[0]
35
+        except socket.error:
36
+            return True
37
+
38
+    # This version is better on platforms that support it.
39
+    p = poll()
40
+    p.register(sock, POLLIN)
41
+    for (fno, ev) in p.poll(0.0):
42
+        if fno == sock.fileno():
43
+            # Either data is buffered (bad), or the connection is dropped.
44
+            return True
45
+
46
+
47
+# This function is copied from socket.py in the Python 2.7 standard
48
+# library test suite. Added to its signature is only `socket_options`.
49
+# One additional modification is that we avoid binding to IPv6 servers
50
+# discovered in DNS if the system doesn't have IPv6 functionality.
51
+def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
52
+                      source_address=None, socket_options=None):
53
+    """Connect to *address* and return the socket object.
54
+
55
+    Convenience function.  Connect to *address* (a 2-tuple ``(host,
56
+    port)``) and return the socket object.  Passing the optional
57
+    *timeout* parameter will set the timeout on the socket instance
58
+    before attempting to connect.  If no *timeout* is supplied, the
59
+    global default timeout setting returned by :func:`getdefaulttimeout`
60
+    is used.  If *source_address* is set it must be a tuple of (host, port)
61
+    for the socket to bind as a source address before making the connection.
62
+    An host of '' or port 0 tells the OS to use the default.
63
+    """
64
+
65
+    host, port = address
66
+    if host.startswith('['):
67
+        host = host.strip('[]')
68
+    err = None
69
+
70
+    # Using the value from allowed_gai_family() in the context of getaddrinfo lets
71
+    # us select whether to work with IPv4 DNS records, IPv6 records, or both.
72
+    # The original create_connection function always returns all records.
73
+    family = allowed_gai_family()
74
+
75
+    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
76
+        af, socktype, proto, canonname, sa = res
77
+        sock = None
78
+        try:
79
+            sock = socket.socket(af, socktype, proto)
80
+
81
+            # If provided, set socket level options before connecting.
82
+            _set_socket_options(sock, socket_options)
83
+
84
+            if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
85
+                sock.settimeout(timeout)
86
+            if source_address:
87
+                sock.bind(source_address)
88
+            sock.connect(sa)
89
+            return sock
90
+
91
+        except socket.error as e:
92
+            err = e
93
+            if sock is not None:
94
+                sock.close()
95
+                sock = None
96
+
97
+    if err is not None:
98
+        raise err
99
+
100
+    raise socket.error("getaddrinfo returns an empty list")
101
+
102
+
103
+def _set_socket_options(sock, options):
104
+    if options is None:
105
+        return
106
+
107
+    for opt in options:
108
+        sock.setsockopt(*opt)
109
+
110
+
111
+def allowed_gai_family():
112
+    """This function is designed to work in the context of
113
+    getaddrinfo, where family=socket.AF_UNSPEC is the default and
114
+    will perform a DNS search for both IPv6 and IPv4 records."""
115
+
116
+    family = socket.AF_INET
117
+    if HAS_IPV6:
118
+        family = socket.AF_UNSPEC
119
+    return family
120
+
121
+
122
+def _has_ipv6(host):
123
+    """ Returns True if the system can bind an IPv6 address. """
124
+    sock = None
125
+    has_ipv6 = False
126
+
127
+    if socket.has_ipv6:
128
+        # has_ipv6 returns true if cPython was compiled with IPv6 support.
129
+        # It does not tell us if the system has IPv6 support enabled. To
130
+        # determine that we must bind to an IPv6 address.
131
+        # https://github.com/shazow/urllib3/pull/611
132
+        # https://bugs.python.org/issue658327
133
+        try:
134
+            sock = socket.socket(socket.AF_INET6)
135
+            sock.bind((host, 0))
136
+            has_ipv6 = True
137
+        except Exception:
138
+            pass
139
+
140
+    if sock:
141
+        sock.close()
142
+    return has_ipv6
143
+
144
+HAS_IPV6 = _has_ipv6('::1')

+ 72
- 0
Contents/Libraries/Shared/requests/packages/urllib3/util/request.py View File

1
+from __future__ import absolute_import
2
+from base64 import b64encode
3
+
4
+from ..packages.six import b
5
+
6
+ACCEPT_ENCODING = 'gzip,deflate'
7
+
8
+
9
+def make_headers(keep_alive=None, accept_encoding=None, user_agent=None,
10
+                 basic_auth=None, proxy_basic_auth=None, disable_cache=None):
11
+    """
12
+    Shortcuts for generating request headers.
13
+
14
+    :param keep_alive:
15
+        If ``True``, adds 'connection: keep-alive' header.
16
+
17
+    :param accept_encoding:
18
+        Can be a boolean, list, or string.
19
+        ``True`` translates to 'gzip,deflate'.
20
+        List will get joined by comma.
21
+        String will be used as provided.
22
+
23
+    :param user_agent:
24
+        String representing the user-agent you want, such as
25
+        "python-urllib3/0.6"
26
+
27
+    :param basic_auth:
28
+        Colon-separated username:password string for 'authorization: basic ...'
29
+        auth header.
30
+
31
+    :param proxy_basic_auth:
32
+        Colon-separated username:password string for 'proxy-authorization: basic ...'
33
+        auth header.
34
+
35
+    :param disable_cache:
36
+        If ``True``, adds 'cache-control: no-cache' header.
37
+
38
+    Example::
39
+
40
+        >>> make_headers(keep_alive=True, user_agent="Batman/1.0")
41
+        {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'}
42
+        >>> make_headers(accept_encoding=True)
43
+        {'accept-encoding': 'gzip,deflate'}
44
+    """
45
+    headers = {}
46
+    if accept_encoding:
47
+        if isinstance(accept_encoding, str):
48
+            pass
49
+        elif isinstance(accept_encoding, list):
50
+            accept_encoding = ','.join(accept_encoding)
51
+        else:
52
+            accept_encoding = ACCEPT_ENCODING
53
+        headers['accept-encoding'] = accept_encoding
54
+
55
+    if user_agent:
56
+        headers['user-agent'] = user_agent
57
+
58
+    if keep_alive:
59
+        headers['connection'] = 'keep-alive'
60
+
61
+    if basic_auth:
62
+        headers['authorization'] = 'Basic ' + \
63
+            b64encode(b(basic_auth)).decode('utf-8')
64
+
65
+    if proxy_basic_auth:
66
+        headers['proxy-authorization'] = 'Basic ' + \
67
+            b64encode(b(proxy_basic_auth)).decode('utf-8')
68
+
69
+    if disable_cache:
70
+        headers['cache-control'] = 'no-cache'
71
+
72
+    return headers

+ 74
- 0
Contents/Libraries/Shared/requests/packages/urllib3/util/response.py View File

1
+from __future__ import absolute_import
2
+from ..packages.six.moves import http_client as httplib
3
+
4
+from ..exceptions import HeaderParsingError
5
+
6
+
7
+def is_fp_closed(obj):
8
+    """
9
+    Checks whether a given file-like object is closed.
10
+
11
+    :param obj:
12
+        The file-like object to check.
13
+    """
14
+
15
+    try:
16
+        # Check via the official file-like-object way.
17
+        return obj.closed
18
+    except AttributeError:
19
+        pass
20
+
21
+    try:
22
+        # Check if the object is a container for another file-like object that
23
+        # gets released on exhaustion (e.g. HTTPResponse).
24
+        return obj.fp is None
25
+    except AttributeError:
26
+        pass
27
+
28
+    raise ValueError("Unable to determine whether fp is closed.")
29
+
30
+
31
+def assert_header_parsing(headers):
32
+    """
33
+    Asserts whether all headers have been successfully parsed.
34
+    Extracts encountered errors from the result of parsing headers.
35
+
36
+    Only works on Python 3.
37
+
38
+    :param headers: Headers to verify.
39
+    :type headers: `httplib.HTTPMessage`.
40
+
41
+    :raises urllib3.exceptions.HeaderParsingError:
42
+        If parsing errors are found.
43
+    """
44
+
45
+    # This will fail silently if we pass in the wrong kind of parameter.
46
+    # To make debugging easier add an explicit check.
47
+    if not isinstance(headers, httplib.HTTPMessage):
48
+        raise TypeError('expected httplib.Message, got {0}.'.format(
49
+            type(headers)))
50
+
51
+    defects = getattr(headers, 'defects', None)
52
+    get_payload = getattr(headers, 'get_payload', None)
53
+
54
+    unparsed_data = None
55
+    if get_payload:  # Platform-specific: Python 3.
56
+        unparsed_data = get_payload()
57
+
58
+    if defects or unparsed_data:
59
+        raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data)
60
+
61
+
62
+def is_response_to_head(response):
63
+    """
64
+    Checks whether the request of a response has been a HEAD-request.
65
+    Handles the quirks of AppEngine.
66
+
67
+    :param conn:
68
+    :type conn: :class:`httplib.HTTPResponse`
69
+    """
70
+    # FIXME: Can we do this somehow without accessing private httplib _method?
71
+    method = response._method
72
+    if isinstance(method, int):  # Platform-specific: Appengine
73
+        return method == 3
74
+    return method.upper() == 'HEAD'

+ 300
- 0
Contents/Libraries/Shared/requests/packages/urllib3/util/retry.py View File

1
+from __future__ import absolute_import
2
+import time
3
+import logging
4
+
5
+from ..exceptions import (
6
+    ConnectTimeoutError,
7
+    MaxRetryError,
8
+    ProtocolError,
9
+    ReadTimeoutError,
10
+    ResponseError,
11
+)
12
+from ..packages import six
13
+
14
+
15
+log = logging.getLogger(__name__)
16
+
17
+
18
+class Retry(object):
19
+    """ Retry configuration.
20
+
21
+    Each retry attempt will create a new Retry object with updated values, so
22
+    they can be safely reused.
23
+
24
+    Retries can be defined as a default for a pool::
25
+
26
+        retries = Retry(connect=5, read=2, redirect=5)
27
+        http = PoolManager(retries=retries)
28
+        response = http.request('GET', 'http://example.com/')
29
+
30
+    Or per-request (which overrides the default for the pool)::
31
+
32
+        response = http.request('GET', 'http://example.com/', retries=Retry(10))
33
+
34
+    Retries can be disabled by passing ``False``::
35
+
36
+        response = http.request('GET', 'http://example.com/', retries=False)
37
+
38
+    Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless
39
+    retries are disabled, in which case the causing exception will be raised.
40
+
41
+    :param int total:
42
+        Total number of retries to allow. Takes precedence over other counts.
43
+
44
+        Set to ``None`` to remove this constraint and fall back on other
45
+        counts. It's a good idea to set this to some sensibly-high value to
46
+        account for unexpected edge cases and avoid infinite retry loops.
47
+
48
+        Set to ``0`` to fail on the first retry.
49
+
50
+        Set to ``False`` to disable and imply ``raise_on_redirect=False``.
51
+
52
+    :param int connect:
53
+        How many connection-related errors to retry on.
54
+
55
+        These are errors raised before the request is sent to the remote server,
56
+        which we assume has not triggered the server to process the request.
57
+
58
+        Set to ``0`` to fail on the first retry of this type.
59
+
60
+    :param int read:
61
+        How many times to retry on read errors.
62
+
63
+        These errors are raised after the request was sent to the server, so the
64
+        request may have side-effects.
65
+
66
+        Set to ``0`` to fail on the first retry of this type.
67
+
68
+    :param int redirect:
69
+        How many redirects to perform. Limit this to avoid infinite redirect
70
+        loops.
71
+
72
+        A redirect is a HTTP response with a status code 301, 302, 303, 307 or
73
+        308.
74
+
75
+        Set to ``0`` to fail on the first retry of this type.
76
+
77
+        Set to ``False`` to disable and imply ``raise_on_redirect=False``.
78
+
79
+    :param iterable method_whitelist:
80
+        Set of uppercased HTTP method verbs that we should retry on.
81
+
82
+        By default, we only retry on methods which are considered to be
83
+        idempotent (multiple requests with the same parameters end with the
84
+        same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`.
85
+
86
+        Set to a ``False`` value to retry on any verb.
87
+
88
+    :param iterable status_forcelist:
89
+        A set of integer HTTP status codes that we should force a retry on.
90
+        A retry is initiated if the request method is in ``method_whitelist``
91
+        and the response status code is in ``status_forcelist``.
92
+
93
+        By default, this is disabled with ``None``.
94
+
95
+    :param float backoff_factor:
96
+        A backoff factor to apply between attempts after the second try
97
+        (most errors are resolved immediately by a second try without a
98
+        delay). urllib3 will sleep for::
99
+
100
+            {backoff factor} * (2 ^ ({number of total retries} - 1))
101
+
102
+        seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep
103
+        for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer
104
+        than :attr:`Retry.BACKOFF_MAX`.
105
+
106
+        By default, backoff is disabled (set to 0).
107
+
108
+    :param bool raise_on_redirect: Whether, if the number of redirects is
109
+        exhausted, to raise a MaxRetryError, or to return a response with a
110
+        response code in the 3xx range.
111
+
112
+    :param bool raise_on_status: Similar meaning to ``raise_on_redirect``:
113
+        whether we should raise an exception, or return a response,
114
+        if status falls in ``status_forcelist`` range and retries have
115
+        been exhausted.
116
+    """
117
+
118
+    DEFAULT_METHOD_WHITELIST = frozenset([
119
+        'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE'])
120
+
121
+    #: Maximum backoff time.
122
+    BACKOFF_MAX = 120
123
+
124
+    def __init__(self, total=10, connect=None, read=None, redirect=None,
125
+                 method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None,
126
+                 backoff_factor=0, raise_on_redirect=True, raise_on_status=True,
127
+                 _observed_errors=0):
128
+
129
+        self.total = total
130
+        self.connect = connect
131
+        self.read = read
132
+
133
+        if redirect is False or total is False:
134
+            redirect = 0
135
+            raise_on_redirect = False
136
+
137
+        self.redirect = redirect
138
+        self.status_forcelist = status_forcelist or set()
139
+        self.method_whitelist = method_whitelist
140
+        self.backoff_factor = backoff_factor
141
+        self.raise_on_redirect = raise_on_redirect
142
+        self.raise_on_status = raise_on_status
143
+        self._observed_errors = _observed_errors  # TODO: use .history instead?
144
+
145
+    def new(self, **kw):
146
+        params = dict(
147
+            total=self.total,
148
+            connect=self.connect, read=self.read, redirect=self.redirect,
149
+            method_whitelist=self.method_whitelist,
150
+            status_forcelist=self.status_forcelist,
151
+            backoff_factor=self.backoff_factor,
152
+            raise_on_redirect=self.raise_on_redirect,
153
+            raise_on_status=self.raise_on_status,
154
+            _observed_errors=self._observed_errors,
155
+        )
156
+        params.update(kw)
157
+        return type(self)(**params)
158
+
159
+    @classmethod
160
+    def from_int(cls, retries, redirect=True, default=None):
161
+        """ Backwards-compatibility for the old retries format."""
162
+        if retries is None:
163
+            retries = default if default is not None else cls.DEFAULT
164
+
165
+        if isinstance(retries, Retry):
166
+            return retries
167
+
168
+        redirect = bool(redirect) and None
169
+        new_retries = cls(retries, redirect=redirect)
170
+        log.debug("Converted retries value: %r -> %r", retries, new_retries)
171
+        return new_retries
172
+
173
+    def get_backoff_time(self):
174
+        """ Formula for computing the current backoff
175
+
176
+        :rtype: float
177
+        """
178
+        if self._observed_errors <= 1:
179
+            return 0
180
+
181
+        backoff_value = self.backoff_factor * (2 ** (self._observed_errors - 1))
182
+        return min(self.BACKOFF_MAX, backoff_value)
183
+
184
+    def sleep(self):
185
+        """ Sleep between retry attempts using an exponential backoff.
186
+
187
+        By default, the backoff factor is 0 and this method will return
188
+        immediately.
189
+        """
190
+        backoff = self.get_backoff_time()
191
+        if backoff <= 0:
192
+            return
193
+        time.sleep(backoff)
194
+
195
+    def _is_connection_error(self, err):
196
+        """ Errors when we're fairly sure that the server did not receive the
197
+        request, so it should be safe to retry.
198
+        """
199
+        return isinstance(err, ConnectTimeoutError)
200
+
201
+    def _is_read_error(self, err):
202
+        """ Errors that occur after the request has been started, so we should
203
+        assume that the server began processing it.
204
+        """
205
+        return isinstance(err, (ReadTimeoutError, ProtocolError))
206
+
207
+    def is_forced_retry(self, method, status_code):
208
+        """ Is this method/status code retryable? (Based on method/codes whitelists)
209
+        """
210
+        if self.method_whitelist and method.upper() not in self.method_whitelist:
211
+            return False
212
+
213
+        return self.status_forcelist and status_code in self.status_forcelist
214
+
215
+    def is_exhausted(self):
216
+        """ Are we out of retries? """
217
+        retry_counts = (self.total, self.connect, self.read, self.redirect)
218
+        retry_counts = list(filter(None, retry_counts))
219
+        if not retry_counts:
220
+            return False
221
+
222
+        return min(retry_counts) < 0
223
+
224
+    def increment(self, method=None, url=None, response=None, error=None,
225
+                  _pool=None, _stacktrace=None):
226
+        """ Return a new Retry object with incremented retry counters.
227
+
228
+        :param response: A response object, or None, if the server did not
229
+            return a response.
230
+        :type response: :class:`~urllib3.response.HTTPResponse`
231
+        :param Exception error: An error encountered during the request, or
232
+            None if the response was received successfully.
233
+
234
+        :return: A new ``Retry`` object.
235
+        """
236
+        if self.total is False and error:
237
+            # Disabled, indicate to re-raise the error.
238
+            raise six.reraise(type(error), error, _stacktrace)
239
+
240
+        total = self.total
241
+        if total is not None:
242
+            total -= 1
243
+
244
+        _observed_errors = self._observed_errors
245
+        connect = self.connect
246
+        read = self.read
247
+        redirect = self.redirect
248
+        cause = 'unknown'
249
+
250
+        if error and self._is_connection_error(error):
251
+            # Connect retry?
252
+            if connect is False:
253
+                raise six.reraise(type(error), error, _stacktrace)
254
+            elif connect is not None:
255
+                connect -= 1
256
+            _observed_errors += 1
257
+
258
+        elif error and self._is_read_error(error):
259
+            # Read retry?
260
+            if read is False:
261
+                raise six.reraise(type(error), error, _stacktrace)
262
+            elif read is not None:
263
+                read -= 1
264
+            _observed_errors += 1
265
+
266
+        elif response and response.get_redirect_location():
267
+            # Redirect retry?
268
+            if redirect is not None:
269
+                redirect -= 1
270
+            cause = 'too many redirects'
271
+
272
+        else:
273
+            # Incrementing because of a server error like a 500 in
274
+            # status_forcelist and a the given method is in the whitelist
275
+            _observed_errors += 1
276
+            cause = ResponseError.GENERIC_ERROR
277
+            if response and response.status:
278
+                cause = ResponseError.SPECIFIC_ERROR.format(
279
+                    status_code=response.status)
280
+
281
+        new_retry = self.new(
282
+            total=total,
283
+            connect=connect, read=read, redirect=redirect,
284
+            _observed_errors=_observed_errors)
285
+
286
+        if new_retry.is_exhausted():
287
+            raise MaxRetryError(_pool, url, error or ResponseError(cause))
288
+
289
+        log.debug("Incremented Retry for (url='%s'): %r", url, new_retry)
290
+
291
+        return new_retry
292
+
293
+    def __repr__(self):
294
+        return ('{cls.__name__}(total={self.total}, connect={self.connect}, '
295
+                'read={self.read}, redirect={self.redirect})').format(
296
+                    cls=type(self), self=self)
297
+
298
+
299
+# For backwards compatibility (equivalent to pre-v1.9):
300
+Retry.DEFAULT = Retry(3)

+ 320
- 0
Contents/Libraries/Shared/requests/packages/urllib3/util/ssl_.py View File

1
+from __future__ import absolute_import
2
+import errno
3
+import warnings
4
+import hmac
5
+
6
+from binascii import hexlify, unhexlify
7
+from hashlib import md5, sha1, sha256
8
+
9
+from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning
10
+
11
+
12
+SSLContext = None
13
+HAS_SNI = False
14
+create_default_context = None
15
+IS_PYOPENSSL = False
16
+
17
+# Maps the length of a digest to a possible hash function producing this digest
18
+HASHFUNC_MAP = {
19
+    32: md5,
20
+    40: sha1,
21
+    64: sha256,
22
+}
23
+
24
+
25
+def _const_compare_digest_backport(a, b):
26
+    """
27
+    Compare two digests of equal length in constant time.
28
+
29
+    The digests must be of type str/bytes.
30
+    Returns True if the digests match, and False otherwise.
31
+    """
32
+    result = abs(len(a) - len(b))
33
+    for l, r in zip(bytearray(a), bytearray(b)):
34
+        result |= l ^ r
35
+    return result == 0
36
+
37
+
38
+_const_compare_digest = getattr(hmac, 'compare_digest',
39
+                                _const_compare_digest_backport)
40
+
41
+
42
+try:  # Test for SSL features
43
+    import ssl
44
+    from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23
45
+    from ssl import HAS_SNI  # Has SNI?
46
+except ImportError:
47
+    pass
48
+
49
+
50
+try:
51
+    from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION
52
+except ImportError:
53
+    OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000
54
+    OP_NO_COMPRESSION = 0x20000
55
+
56
+# A secure default.
57
+# Sources for more information on TLS ciphers:
58
+#
59
+# - https://wiki.mozilla.org/Security/Server_Side_TLS
60
+# - https://www.ssllabs.com/projects/best-practices/index.html
61
+# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
62
+#
63
+# The general intent is:
64
+# - Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE),
65
+# - prefer ECDHE over DHE for better performance,
66
+# - prefer any AES-GCM over any AES-CBC for better performance and security,
67
+# - use 3DES as fallback which is secure but slow,
68
+# - disable NULL authentication, MD5 MACs and DSS for security reasons.
69
+DEFAULT_CIPHERS = (
70
+    'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
71
+    'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:'
72
+    '!eNULL:!MD5'
73
+)
74
+
75
+try:
76
+    from ssl import SSLContext  # Modern SSL?
77
+except ImportError:
78
+    import sys
79
+
80
+    class SSLContext(object):  # Platform-specific: Python 2 & 3.1
81
+        supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or
82
+                                (3, 2) <= sys.version_info)
83
+
84
+        def __init__(self, protocol_version):
85
+            self.protocol = protocol_version
86
+            # Use default values from a real SSLContext
87
+            self.check_hostname = False
88
+            self.verify_mode = ssl.CERT_NONE
89
+            self.ca_certs = None
90
+            self.options = 0
91
+            self.certfile = None
92
+            self.keyfile = None
93
+            self.ciphers = None
94
+
95
+        def load_cert_chain(self, certfile, keyfile):
96
+            self.certfile = certfile
97
+            self.keyfile = keyfile
98
+
99
+        def load_verify_locations(self, cafile=None, capath=None):
100
+            self.ca_certs = cafile
101
+
102
+            if capath is not None:
103
+                raise SSLError("CA directories not supported in older Pythons")
104
+
105
+        def set_ciphers(self, cipher_suite):
106
+            if not self.supports_set_ciphers:
107
+                raise TypeError(
108
+                    'Your version of Python does not support setting '
109
+                    'a custom cipher suite. Please upgrade to Python '
110
+                    '2.7, 3.2, or later if you need this functionality.'
111
+                )
112
+            self.ciphers = cipher_suite
113
+
114
+        def wrap_socket(self, socket, server_hostname=None, server_side=False):
115
+            warnings.warn(
116
+                'A true SSLContext object is not available. This prevents '
117
+                'urllib3 from configuring SSL appropriately and may cause '
118
+                'certain SSL connections to fail. You can upgrade to a newer '
119
+                'version of Python to solve this. For more information, see '
120
+                'https://urllib3.readthedocs.io/en/latest/security.html'
121
+                '#insecureplatformwarning.',
122
+                InsecurePlatformWarning
123
+            )
124
+            kwargs = {
125
+                'keyfile': self.keyfile,
126
+                'certfile': self.certfile,
127
+                'ca_certs': self.ca_certs,
128
+                'cert_reqs': self.verify_mode,
129
+                'ssl_version': self.protocol,
130
+                'server_side': server_side,
131
+            }
132
+            if self.supports_set_ciphers:  # Platform-specific: Python 2.7+
133
+                return wrap_socket(socket, ciphers=self.ciphers, **kwargs)
134
+            else:  # Platform-specific: Python 2.6
135
+                return wrap_socket(socket, **kwargs)
136
+
137
+
138
+def assert_fingerprint(cert, fingerprint):
139
+    """
140
+    Checks if given fingerprint matches the supplied certificate.
141
+
142
+    :param cert:
143
+        Certificate as bytes object.
144
+    :param fingerprint:
145
+        Fingerprint as string of hexdigits, can be interspersed by colons.
146
+    """
147
+
148
+    fingerprint = fingerprint.replace(':', '').lower()
149
+    digest_length = len(fingerprint)
150
+    hashfunc = HASHFUNC_MAP.get(digest_length)
151
+    if not hashfunc:
152
+        raise SSLError(
153
+            'Fingerprint of invalid length: {0}'.format(fingerprint))
154
+
155
+    # We need encode() here for py32; works on py2 and p33.
156
+    fingerprint_bytes = unhexlify(fingerprint.encode())
157
+
158
+    cert_digest = hashfunc(cert).digest()
159
+
160
+    if not _const_compare_digest(cert_digest, fingerprint_bytes):
161
+        raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".'
162
+                       .format(fingerprint, hexlify(cert_digest)))
163
+
164
+
165
+def resolve_cert_reqs(candidate):
166
+    """
167
+    Resolves the argument to a numeric constant, which can be passed to
168
+    the wrap_socket function/method from the ssl module.
169
+    Defaults to :data:`ssl.CERT_NONE`.
170
+    If given a string it is assumed to be the name of the constant in the
171
+    :mod:`ssl` module or its abbrevation.
172
+    (So you can specify `REQUIRED` instead of `CERT_REQUIRED`.
173
+    If it's neither `None` nor a string we assume it is already the numeric
174
+    constant which can directly be passed to wrap_socket.
175
+    """
176
+    if candidate is None:
177
+        return CERT_NONE
178
+
179
+    if isinstance(candidate, str):
180
+        res = getattr(ssl, candidate, None)
181
+        if res is None:
182
+            res = getattr(ssl, 'CERT_' + candidate)
183
+        return res
184
+
185
+    return candidate
186
+
187
+
188
+def resolve_ssl_version(candidate):
189
+    """
190
+    like resolve_cert_reqs
191
+    """
192
+    if candidate is None:
193
+        return PROTOCOL_SSLv23
194
+
195
+    if isinstance(candidate, str):
196
+        res = getattr(ssl, candidate, None)
197
+        if res is None:
198
+            res = getattr(ssl, 'PROTOCOL_' + candidate)
199
+        return res
200
+
201
+    return candidate
202
+
203
+
204
+def create_urllib3_context(ssl_version=None, cert_reqs=None,
205
+                           options=None, ciphers=None):
206
+    """All arguments have the same meaning as ``ssl_wrap_socket``.
207
+
208
+    By default, this function does a lot of the same work that
209
+    ``ssl.create_default_context`` does on Python 3.4+. It:
210
+
211
+    - Disables SSLv2, SSLv3, and compression
212
+    - Sets a restricted set of server ciphers
213
+
214
+    If you wish to enable SSLv3, you can do::
215
+
216
+        from urllib3.util import ssl_
217
+        context = ssl_.create_urllib3_context()
218
+        context.options &= ~ssl_.OP_NO_SSLv3
219
+
220
+    You can do the same to enable compression (substituting ``COMPRESSION``
221
+    for ``SSLv3`` in the last line above).
222
+
223
+    :param ssl_version:
224
+        The desired protocol version to use. This will default to
225
+        PROTOCOL_SSLv23 which will negotiate the highest protocol that both
226
+        the server and your installation of OpenSSL support.
227
+    :param cert_reqs:
228
+        Whether to require the certificate verification. This defaults to
229
+        ``ssl.CERT_REQUIRED``.
230
+    :param options:
231
+        Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``,
232
+        ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``.
233
+    :param ciphers:
234
+        Which cipher suites to allow the server to select.
235
+    :returns:
236
+        Constructed SSLContext object with specified options
237
+    :rtype: SSLContext
238
+    """
239
+    context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23)
240
+
241
+    # Setting the default here, as we may have no ssl module on import
242
+    cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs
243
+
244
+    if options is None:
245
+        options = 0
246
+        # SSLv2 is easily broken and is considered harmful and dangerous
247
+        options |= OP_NO_SSLv2
248
+        # SSLv3 has several problems and is now dangerous
249
+        options |= OP_NO_SSLv3
250
+        # Disable compression to prevent CRIME attacks for OpenSSL 1.0+
251
+        # (issue #309)
252
+        options |= OP_NO_COMPRESSION
253
+
254
+    context.options |= options
255
+
256
+    if getattr(context, 'supports_set_ciphers', True):  # Platform-specific: Python 2.6
257
+        context.set_ciphers(ciphers or DEFAULT_CIPHERS)
258
+
259
+    context.verify_mode = cert_reqs
260
+    if getattr(context, 'check_hostname', None) is not None:  # Platform-specific: Python 3.2
261
+        # We do our own verification, including fingerprints and alternative
262
+        # hostnames. So disable it here
263
+        context.check_hostname = False
264
+    return context
265
+
266
+
267
+def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
268
+                    ca_certs=None, server_hostname=None,
269
+                    ssl_version=None, ciphers=None, ssl_context=None,
270
+                    ca_cert_dir=None):
271
+    """
272
+    All arguments except for server_hostname, ssl_context, and ca_cert_dir have
273
+    the same meaning as they do when using :func:`ssl.wrap_socket`.
274
+
275
+    :param server_hostname:
276
+        When SNI is supported, the expected hostname of the certificate
277
+    :param ssl_context:
278
+        A pre-made :class:`SSLContext` object. If none is provided, one will
279
+        be created using :func:`create_urllib3_context`.
280
+    :param ciphers:
281
+        A string of ciphers we wish the client to support. This is not
282
+        supported on Python 2.6 as the ssl module does not support it.
283
+    :param ca_cert_dir:
284
+        A directory containing CA certificates in multiple separate files, as
285
+        supported by OpenSSL's -CApath flag or the capath argument to
286
+        SSLContext.load_verify_locations().
287
+    """
288
+    context = ssl_context
289
+    if context is None:
290
+        context = create_urllib3_context(ssl_version, cert_reqs,
291
+                                         ciphers=ciphers)
292
+
293
+    if ca_certs or ca_cert_dir:
294
+        try:
295
+            context.load_verify_locations(ca_certs, ca_cert_dir)
296
+        except IOError as e:  # Platform-specific: Python 2.6, 2.7, 3.2
297
+            raise SSLError(e)
298
+        # Py33 raises FileNotFoundError which subclasses OSError
299
+        # These are not equivalent unless we check the errno attribute
300
+        except OSError as e:  # Platform-specific: Python 3.3 and beyond
301
+            if e.errno == errno.ENOENT:
302
+                raise SSLError(e)
303
+            raise
304
+
305
+    if certfile:
306
+        context.load_cert_chain(certfile, keyfile)
307
+    if HAS_SNI:  # Platform-specific: OpenSSL with enabled SNI
308
+        return context.wrap_socket(sock, server_hostname=server_hostname)
309
+
310
+    warnings.warn(
311
+        'An HTTPS request has been made, but the SNI (Subject Name '
312
+        'Indication) extension to TLS is not available on this platform. '
313
+        'This may cause the server to present an incorrect TLS '
314
+        'certificate, which can cause validation failures. You can upgrade to '
315
+        'a newer version of Python to solve this. For more information, see '
316
+        'https://urllib3.readthedocs.io/en/latest/security.html'
317
+        '#snimissingwarning.',
318
+        SNIMissingWarning
319
+    )
320
+    return context.wrap_socket(sock)

+ 242
- 0
Contents/Libraries/Shared/requests/packages/urllib3/util/timeout.py View File

1
+from __future__ import absolute_import
2
+# The default socket timeout, used by httplib to indicate that no timeout was
3
+# specified by the user
4
+from socket import _GLOBAL_DEFAULT_TIMEOUT
5
+import time
6
+
7
+from ..exceptions import TimeoutStateError
8
+
9
+# A sentinel value to indicate that no timeout was specified by the user in
10
+# urllib3
11
+_Default = object()
12
+
13
+
14
+def current_time():
15
+    """
16
+    Retrieve the current time. This function is mocked out in unit testing.
17
+    """
18
+    return time.time()
19
+
20
+
21
+class Timeout(object):
22
+    """ Timeout configuration.
23
+
24
+    Timeouts can be defined as a default for a pool::
25
+
26
+        timeout = Timeout(connect=2.0, read=7.0)
27
+        http = PoolManager(timeout=timeout)
28
+        response = http.request('GET', 'http://example.com/')
29
+
30
+    Or per-request (which overrides the default for the pool)::
31
+
32
+        response = http.request('GET', 'http://example.com/', timeout=Timeout(10))
33
+
34
+    Timeouts can be disabled by setting all the parameters to ``None``::
35
+
36
+        no_timeout = Timeout(connect=None, read=None)
37
+        response = http.request('GET', 'http://example.com/, timeout=no_timeout)
38
+
39
+
40
+    :param total:
41
+        This combines the connect and read timeouts into one; the read timeout
42
+        will be set to the time leftover from the connect attempt. In the
43
+        event that both a connect timeout and a total are specified, or a read
44
+        timeout and a total are specified, the shorter timeout will be applied.
45
+
46
+        Defaults to None.
47
+
48
+    :type total: integer, float, or None
49
+
50
+    :param connect:
51
+        The maximum amount of time to wait for a connection attempt to a server
52
+        to succeed. Omitting the parameter will default the connect timeout to
53
+        the system default, probably `the global default timeout in socket.py
54
+        <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
55
+        None will set an infinite timeout for connection attempts.
56
+
57
+    :type connect: integer, float, or None
58
+
59
+    :param read:
60
+        The maximum amount of time to wait between consecutive
61
+        read operations for a response from the server. Omitting
62
+        the parameter will default the read timeout to the system
63
+        default, probably `the global default timeout in socket.py
64
+        <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
65
+        None will set an infinite timeout.
66
+
67
+    :type read: integer, float, or None
68
+
69
+    .. note::
70
+
71
+        Many factors can affect the total amount of time for urllib3 to return
72
+        an HTTP response.
73
+
74
+        For example, Python's DNS resolver does not obey the timeout specified
75
+        on the socket. Other factors that can affect total request time include
76
+        high CPU load, high swap, the program running at a low priority level,
77
+        or other behaviors.
78
+
79
+        In addition, the read and total timeouts only measure the time between
80
+        read operations on the socket connecting the client and the server,
81
+        not the total amount of time for the request to return a complete
82
+        response. For most requests, the timeout is raised because the server
83
+        has not sent the first byte in the specified time. This is not always
84
+        the case; if a server streams one byte every fifteen seconds, a timeout
85
+        of 20 seconds will not trigger, even though the request will take
86
+        several minutes to complete.
87
+
88
+        If your goal is to cut off any request after a set amount of wall clock
89
+        time, consider having a second "watcher" thread to cut off a slow
90
+        request.
91
+    """
92
+
93
+    #: A sentinel object representing the default timeout value
94
+    DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT
95
+
96
+    def __init__(self, total=None, connect=_Default, read=_Default):
97
+        self._connect = self._validate_timeout(connect, 'connect')
98
+        self._read = self._validate_timeout(read, 'read')
99
+        self.total = self._validate_timeout(total, 'total')
100
+        self._start_connect = None
101
+
102
+    def __str__(self):
103
+        return '%s(connect=%r, read=%r, total=%r)' % (
104
+            type(self).__name__, self._connect, self._read, self.total)
105
+
106
+    @classmethod
107
+    def _validate_timeout(cls, value, name):
108
+        """ Check that a timeout attribute is valid.
109
+
110
+        :param value: The timeout value to validate
111
+        :param name: The name of the timeout attribute to validate. This is
112
+            used to specify in error messages.
113
+        :return: The validated and casted version of the given value.
114
+        :raises ValueError: If the type is not an integer or a float, or if it
115
+            is a numeric value less than zero.
116
+        """
117
+        if value is _Default:
118
+            return cls.DEFAULT_TIMEOUT
119
+
120
+        if value is None or value is cls.DEFAULT_TIMEOUT:
121
+            return value
122
+
123
+        try:
124
+            float(value)
125
+        except (TypeError, ValueError):
126
+            raise ValueError("Timeout value %s was %s, but it must be an "
127
+                             "int or float." % (name, value))
128
+
129
+        try:
130
+            if value < 0:
131
+                raise ValueError("Attempted to set %s timeout to %s, but the "
132
+                                 "timeout cannot be set to a value less "
133
+                                 "than 0." % (name, value))
134
+        except TypeError:  # Python 3
135
+            raise ValueError("Timeout value %s was %s, but it must be an "
136
+                             "int or float." % (name, value))
137
+
138
+        return value
139
+
140
+    @classmethod
141
+    def from_float(cls, timeout):
142
+        """ Create a new Timeout from a legacy timeout value.
143
+
144
+        The timeout value used by httplib.py sets the same timeout on the
145
+        connect(), and recv() socket requests. This creates a :class:`Timeout`
146
+        object that sets the individual timeouts to the ``timeout`` value
147
+        passed to this function.
148
+
149
+        :param timeout: The legacy timeout value.
150
+        :type timeout: integer, float, sentinel default object, or None
151
+        :return: Timeout object
152
+        :rtype: :class:`Timeout`
153
+        """
154
+        return Timeout(read=timeout, connect=timeout)
155
+
156
+    def clone(self):
157
+        """ Create a copy of the timeout object
158
+
159
+        Timeout properties are stored per-pool but each request needs a fresh
160
+        Timeout object to ensure each one has its own start/stop configured.
161
+
162
+        :return: a copy of the timeout object
163
+        :rtype: :class:`Timeout`
164
+        """
165
+        # We can't use copy.deepcopy because that will also create a new object
166
+        # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to
167
+        # detect the user default.
168
+        return Timeout(connect=self._connect, read=self._read,
169
+                       total=self.total)
170
+
171
+    def start_connect(self):
172
+        """ Start the timeout clock, used during a connect() attempt
173
+
174
+        :raises urllib3.exceptions.TimeoutStateError: if you attempt
175
+            to start a timer that has been started already.
176
+        """
177
+        if self._start_connect is not None:
178
+            raise TimeoutStateError("Timeout timer has already been started.")
179
+        self._start_connect = current_time()
180
+        return self._start_connect
181
+
182
+    def get_connect_duration(self):
183
+        """ Gets the time elapsed since the call to :meth:`start_connect`.
184
+
185
+        :return: Elapsed time.
186
+        :rtype: float
187
+        :raises urllib3.exceptions.TimeoutStateError: if you attempt
188
+            to get duration for a timer that hasn't been started.
189
+        """
190
+        if self._start_connect is None:
191
+            raise TimeoutStateError("Can't get connect duration for timer "
192
+                                    "that has not started.")
193
+        return current_time() - self._start_connect
194
+
195
+    @property
196
+    def connect_timeout(self):
197
+        """ Get the value to use when setting a connection timeout.
198
+
199
+        This will be a positive float or integer, the value None
200
+        (never timeout), or the default system timeout.
201
+
202
+        :return: Connect timeout.
203
+        :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
204
+        """
205
+        if self.total is None:
206
+            return self._connect
207
+
208
+        if self._connect is None or self._connect is self.DEFAULT_TIMEOUT:
209
+            return self.total
210
+
211
+        return min(self._connect, self.total)
212
+
213
+    @property
214
+    def read_timeout(self):
215
+        """ Get the value for the read timeout.
216
+
217
+        This assumes some time has elapsed in the connection timeout and
218
+        computes the read timeout appropriately.
219
+
220
+        If self.total is set, the read timeout is dependent on the amount of
221
+        time taken by the connect timeout. If the connection time has not been
222
+        established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be
223
+        raised.
224
+
225
+        :return: Value to use for the read timeout.
226
+        :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
227
+        :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect`
228
+            has not yet been called on this object.
229
+        """
230
+        if (self.total is not None and
231
+                self.total is not self.DEFAULT_TIMEOUT and
232
+                self._read is not None and
233
+                self._read is not self.DEFAULT_TIMEOUT):
234
+            # In case the connect timeout has not yet been established.
235
+            if self._start_connect is None:
236
+                return self._read
237
+            return max(0, min(self.total - self.get_connect_duration(),
238
+                              self._read))
239
+        elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT:
240
+            return max(0, self.total - self.get_connect_duration())
241
+        else:
242
+            return self._read

+ 217
- 0
Contents/Libraries/Shared/requests/packages/urllib3/util/url.py View File

1
+from __future__ import absolute_import
2
+from collections import namedtuple
3
+
4
+from ..exceptions import LocationParseError
5
+
6
+
7
+url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment']
8
+
9
+
10
+class Url(namedtuple('Url', url_attrs)):
11
+    """
12
+    Datastructure for representing an HTTP URL. Used as a return value for
13
+    :func:`parse_url`.
14
+    """
15
+    slots = ()
16
+
17
+    def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None,
18
+                query=None, fragment=None):
19
+        if path and not path.startswith('/'):
20
+            path = '/' + path
21
+        return super(Url, cls).__new__(cls, scheme, auth, host, port, path,
22
+                                       query, fragment)
23
+
24
+    @property
25
+    def hostname(self):
26
+        """For backwards-compatibility with urlparse. We're nice like that."""
27
+        return self.host
28
+
29
+    @property
30
+    def request_uri(self):
31
+        """Absolute path including the query string."""
32
+        uri = self.path or '/'
33
+
34
+        if self.query is not None:
35
+            uri += '?' + self.query
36
+
37
+        return uri
38
+
39
+    @property
40
+    def netloc(self):
41
+        """Network location including host and port"""
42
+        if self.port:
43
+            return '%s:%d' % (self.host, self.port)
44
+        return self.host
45
+
46
+    @property
47
+    def url(self):
48
+        """
49
+        Convert self into a url
50
+
51
+        This function should more or less round-trip with :func:`.parse_url`. The
52
+        returned url may not be exactly the same as the url inputted to
53
+        :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls
54
+        with a blank port will have : removed).
55
+
56
+        Example: ::
57
+
58
+            >>> U = parse_url('http://google.com/mail/')
59
+            >>> U.url
60
+            'http://google.com/mail/'
61
+            >>> Url('http', 'username:password', 'host.com', 80,
62
+            ... '/path', 'query', 'fragment').url
63
+            'http://username:password@host.com:80/path?query#fragment'
64
+        """
65
+        scheme, auth, host, port, path, query, fragment = self
66
+        url = ''
67
+
68
+        # We use "is not None" we want things to happen with empty strings (or 0 port)
69
+        if scheme is not None:
70
+            url += scheme + '://'
71
+        if auth is not None:
72
+            url += auth + '@'
73
+        if host is not None:
74
+            url += host
75
+        if port is not None:
76
+            url += ':' + str(port)
77
+        if path is not None:
78
+            url += path
79
+        if query is not None:
80
+            url += '?' + query
81
+        if fragment is not None:
82
+            url += '#' + fragment
83
+
84
+        return url
85
+
86
+    def __str__(self):
87
+        return self.url
88
+
89
+
90
+def split_first(s, delims):
91
+    """
92
+    Given a string and an iterable of delimiters, split on the first found
93
+    delimiter. Return two split parts and the matched delimiter.
94
+
95
+    If not found, then the first part is the full input string.
96
+
97
+    Example::
98
+
99
+        >>> split_first('foo/bar?baz', '?/=')
100
+        ('foo', 'bar?baz', '/')
101
+        >>> split_first('foo/bar?baz', '123')
102
+        ('foo/bar?baz', '', None)
103
+
104
+    Scales linearly with number of delims. Not ideal for large number of delims.
105
+    """
106
+    min_idx = None
107
+    min_delim = None
108
+    for d in delims:
109
+        idx = s.find(d)
110
+        if idx < 0:
111
+            continue
112
+
113
+        if min_idx is None or idx < min_idx:
114
+            min_idx = idx
115
+            min_delim = d
116
+
117
+    if min_idx is None or min_idx < 0:
118
+        return s, '', None
119
+
120
+    return s[:min_idx], s[min_idx + 1:], min_delim
121
+
122
+
123
+def parse_url(url):
124
+    """
125
+    Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is
126
+    performed to parse incomplete urls. Fields not provided will be None.
127
+
128
+    Partly backwards-compatible with :mod:`urlparse`.
129
+
130
+    Example::
131
+
132
+        >>> parse_url('http://google.com/mail/')
133
+        Url(scheme='http', host='google.com', port=None, path='/mail/', ...)
134
+        >>> parse_url('google.com:80')
135
+        Url(scheme=None, host='google.com', port=80, path=None, ...)
136
+        >>> parse_url('/foo?bar')
137
+        Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...)
138
+    """
139
+
140
+    # While this code has overlap with stdlib's urlparse, it is much
141
+    # simplified for our needs and less annoying.
142
+    # Additionally, this implementations does silly things to be optimal
143
+    # on CPython.
144
+
145
+    if not url:
146
+        # Empty
147
+        return Url()
148
+
149
+    scheme = None
150
+    auth = None
151
+    host = None
152
+    port = None
153
+    path = None
154
+    fragment = None
155
+    query = None
156
+
157
+    # Scheme
158
+    if '://' in url:
159
+        scheme, url = url.split('://', 1)
160
+
161
+    # Find the earliest Authority Terminator
162
+    # (http://tools.ietf.org/html/rfc3986#section-3.2)
163
+    url, path_, delim = split_first(url, ['/', '?', '#'])
164
+
165
+    if delim:
166
+        # Reassemble the path
167
+        path = delim + path_
168
+
169
+    # Auth
170
+    if '@' in url:
171
+        # Last '@' denotes end of auth part
172
+        auth, url = url.rsplit('@', 1)
173
+
174
+    # IPv6
175
+    if url and url[0] == '[':
176
+        host, url = url.split(']', 1)
177
+        host += ']'
178
+
179
+    # Port
180
+    if ':' in url:
181
+        _host, port = url.split(':', 1)
182
+
183
+        if not host:
184
+            host = _host
185
+
186
+        if port:
187
+            # If given, ports must be integers.
188
+            if not port.isdigit():
189
+                raise LocationParseError(url)
190
+            port = int(port)
191
+        else:
192
+            # Blank ports are cool, too. (rfc3986#section-3.2.3)
193
+            port = None
194
+
195
+    elif not host and url:
196
+        host = url
197
+
198
+    if not path:
199
+        return Url(scheme, auth, host, port, path, query, fragment)
200
+
201
+    # Fragment
202
+    if '#' in path:
203
+        path, fragment = path.split('#', 1)
204
+
205
+    # Query
206
+    if '?' in path:
207
+        path, query = path.split('?', 1)
208
+
209
+    return Url(scheme, auth, host, port, path, query, fragment)
210
+
211
+
212
+def get_host(url):
213
+    """
214
+    Deprecated. Use :func:`.parse_url` instead.
215
+    """
216
+    p = parse_url(url)
217
+    return p.scheme or 'http', p.hostname, p.port

+ 712
- 0
Contents/Libraries/Shared/requests/sessions.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+requests.session
5
+~~~~~~~~~~~~~~~~
6
+
7
+This module provides a Session object to manage and persist settings across
8
+requests (cookies, auth, proxies).
9
+"""
10
+import os
11
+from collections import Mapping
12
+from datetime import datetime
13
+
14
+from .auth import _basic_auth_str
15
+from .compat import cookielib, OrderedDict, urljoin, urlparse
16
+from .cookies import (
17
+    cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies)
18
+from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT
19
+from .hooks import default_hooks, dispatch_hook
20
+from .utils import to_key_val_list, default_headers, to_native_string
21
+from .exceptions import (
22
+    TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError)
23
+from .packages.urllib3._collections import RecentlyUsedContainer
24
+from .structures import CaseInsensitiveDict
25
+
26
+from .adapters import HTTPAdapter
27
+
28
+from .utils import (
29
+    requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies,
30
+    get_auth_from_url
31
+)
32
+
33
+from .status_codes import codes
34
+
35
+# formerly defined here, reexposed here for backward compatibility
36
+from .models import REDIRECT_STATI
37
+
38
+REDIRECT_CACHE_SIZE = 1000
39
+
40
+
41
+def merge_setting(request_setting, session_setting, dict_class=OrderedDict):
42
+    """Determines appropriate setting for a given request, taking into account
43
+    the explicit setting on that request, and the setting in the session. If a
44
+    setting is a dictionary, they will be merged together using `dict_class`
45
+    """
46
+
47
+    if session_setting is None:
48
+        return request_setting
49
+
50
+    if request_setting is None:
51
+        return session_setting
52
+
53
+    # Bypass if not a dictionary (e.g. verify)
54
+    if not (
55
+            isinstance(session_setting, Mapping) and
56
+            isinstance(request_setting, Mapping)
57
+    ):
58
+        return request_setting
59
+
60
+    merged_setting = dict_class(to_key_val_list(session_setting))
61
+    merged_setting.update(to_key_val_list(request_setting))
62
+
63
+    # Remove keys that are set to None. Extract keys first to avoid altering
64
+    # the dictionary during iteration.
65
+    none_keys = [k for (k, v) in merged_setting.items() if v is None]
66
+    for key in none_keys:
67
+        del merged_setting[key]
68
+
69
+    return merged_setting
70
+
71
+
72
+def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict):
73
+    """Properly merges both requests and session hooks.
74
+
75
+    This is necessary because when request_hooks == {'response': []}, the
76
+    merge breaks Session hooks entirely.
77
+    """
78
+    if session_hooks is None or session_hooks.get('response') == []:
79
+        return request_hooks
80
+
81
+    if request_hooks is None or request_hooks.get('response') == []:
82
+        return session_hooks
83
+
84
+    return merge_setting(request_hooks, session_hooks, dict_class)
85
+
86
+
87
+class SessionRedirectMixin(object):
88
+    def resolve_redirects(self, resp, req, stream=False, timeout=None,
89
+                          verify=True, cert=None, proxies=None, **adapter_kwargs):
90
+        """Receives a Response. Returns a generator of Responses."""
91
+
92
+        i = 0
93
+        hist = [] # keep track of history
94
+
95
+        while resp.is_redirect:
96
+            prepared_request = req.copy()
97
+
98
+            if i > 0:
99
+                # Update history and keep track of redirects.
100
+                hist.append(resp)
101
+                new_hist = list(hist)
102
+                resp.history = new_hist
103
+
104
+            try:
105
+                resp.content  # Consume socket so it can be released
106
+            except (ChunkedEncodingError, ContentDecodingError, RuntimeError):
107
+                resp.raw.read(decode_content=False)
108
+
109
+            if i >= self.max_redirects:
110
+                raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp)
111
+
112
+            # Release the connection back into the pool.
113
+            resp.close()
114
+
115
+            url = resp.headers['location']
116
+
117
+            # Handle redirection without scheme (see: RFC 1808 Section 4)
118
+            if url.startswith('//'):
119
+                parsed_rurl = urlparse(resp.url)
120
+                url = '%s:%s' % (parsed_rurl.scheme, url)
121
+
122
+            # The scheme should be lower case...
123
+            parsed = urlparse(url)
124
+            url = parsed.geturl()
125
+
126
+            # Facilitate relative 'location' headers, as allowed by RFC 7231.
127
+            # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource')
128
+            # Compliant with RFC3986, we percent encode the url.
129
+            if not parsed.netloc:
130
+                url = urljoin(resp.url, requote_uri(url))
131
+            else:
132
+                url = requote_uri(url)
133
+
134
+            prepared_request.url = to_native_string(url)
135
+            # Cache the url, unless it redirects to itself.
136
+            if resp.is_permanent_redirect and req.url != prepared_request.url:
137
+                self.redirect_cache[req.url] = prepared_request.url
138
+
139
+            self.rebuild_method(prepared_request, resp)
140
+
141
+            # https://github.com/kennethreitz/requests/issues/1084
142
+            if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect):
143
+                # https://github.com/kennethreitz/requests/issues/3490
144
+                purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding')
145
+                for header in purged_headers:
146
+                    prepared_request.headers.pop(header, None)
147
+                prepared_request.body = None
148
+
149
+            headers = prepared_request.headers
150
+            try:
151
+                del headers['Cookie']
152
+            except KeyError:
153
+                pass
154
+
155
+            # Extract any cookies sent on the response to the cookiejar
156
+            # in the new request. Because we've mutated our copied prepared
157
+            # request, use the old one that we haven't yet touched.
158
+            extract_cookies_to_jar(prepared_request._cookies, req, resp.raw)
159
+            prepared_request._cookies.update(self.cookies)
160
+            prepared_request.prepare_cookies(prepared_request._cookies)
161
+
162
+            # Rebuild auth and proxy information.
163
+            proxies = self.rebuild_proxies(prepared_request, proxies)
164
+            self.rebuild_auth(prepared_request, resp)
165
+
166
+            # Override the original request.
167
+            req = prepared_request
168
+
169
+            resp = self.send(
170
+                req,
171
+                stream=stream,
172
+                timeout=timeout,
173
+                verify=verify,
174
+                cert=cert,
175
+                proxies=proxies,
176
+                allow_redirects=False,
177
+                **adapter_kwargs
178
+            )
179
+
180
+            extract_cookies_to_jar(self.cookies, prepared_request, resp.raw)
181
+
182
+            i += 1
183
+            yield resp
184
+
185
+    def rebuild_auth(self, prepared_request, response):
186
+        """When being redirected we may want to strip authentication from the
187
+        request to avoid leaking credentials. This method intelligently removes
188
+        and reapplies authentication where possible to avoid credential loss.
189
+        """
190
+        headers = prepared_request.headers
191
+        url = prepared_request.url
192
+
193
+        if 'Authorization' in headers:
194
+            # If we get redirected to a new host, we should strip out any
195
+            # authentication headers.
196
+            original_parsed = urlparse(response.request.url)
197
+            redirect_parsed = urlparse(url)
198
+
199
+            if (original_parsed.hostname != redirect_parsed.hostname):
200
+                del headers['Authorization']
201
+
202
+        # .netrc might have more auth for us on our new host.
203
+        new_auth = get_netrc_auth(url) if self.trust_env else None
204
+        if new_auth is not None:
205
+            prepared_request.prepare_auth(new_auth)
206
+
207
+        return
208
+
209
+    def rebuild_proxies(self, prepared_request, proxies):
210
+        """This method re-evaluates the proxy configuration by considering the
211
+        environment variables. If we are redirected to a URL covered by
212
+        NO_PROXY, we strip the proxy configuration. Otherwise, we set missing
213
+        proxy keys for this URL (in case they were stripped by a previous
214
+        redirect).
215
+
216
+        This method also replaces the Proxy-Authorization header where
217
+        necessary.
218
+
219
+        :rtype: dict
220
+        """
221
+        headers = prepared_request.headers
222
+        url = prepared_request.url
223
+        scheme = urlparse(url).scheme
224
+        new_proxies = proxies.copy() if proxies is not None else {}
225
+
226
+        if self.trust_env and not should_bypass_proxies(url):
227
+            environ_proxies = get_environ_proxies(url)
228
+
229
+            proxy = environ_proxies.get('all', environ_proxies.get(scheme))
230
+
231
+            if proxy:
232
+                new_proxies.setdefault(scheme, proxy)
233
+
234
+        if 'Proxy-Authorization' in headers:
235
+            del headers['Proxy-Authorization']
236
+
237
+        try:
238
+            username, password = get_auth_from_url(new_proxies[scheme])
239
+        except KeyError:
240
+            username, password = None, None
241
+
242
+        if username and password:
243
+            headers['Proxy-Authorization'] = _basic_auth_str(username, password)
244
+
245
+        return new_proxies
246
+
247
+    def rebuild_method(self, prepared_request, response):
248
+        """When being redirected we may want to change the method of the request
249
+        based on certain specs or browser behavior.
250
+        """
251
+        method = prepared_request.method
252
+
253
+        # http://tools.ietf.org/html/rfc7231#section-6.4.4
254
+        if response.status_code == codes.see_other and method != 'HEAD':
255
+            method = 'GET'
256
+
257
+        # Do what the browsers do, despite standards...
258
+        # First, turn 302s into GETs.
259
+        if response.status_code == codes.found and method != 'HEAD':
260
+            method = 'GET'
261
+
262
+        # Second, if a POST is responded to with a 301, turn it into a GET.
263
+        # This bizarre behaviour is explained in Issue 1704.
264
+        if response.status_code == codes.moved and method == 'POST':
265
+            method = 'GET'
266
+
267
+        prepared_request.method = method
268
+
269
+
270
+class Session(SessionRedirectMixin):
271
+    """A Requests session.
272
+
273
+    Provides cookie persistence, connection-pooling, and configuration.
274
+
275
+    Basic Usage::
276
+
277
+      >>> import requests
278
+      >>> s = requests.Session()
279
+      >>> s.get('http://httpbin.org/get')
280
+      <Response [200]>
281
+
282
+    Or as a context manager::
283
+
284
+      >>> with requests.Session() as s:
285
+      >>>     s.get('http://httpbin.org/get')
286
+      <Response [200]>
287
+    """
288
+
289
+    __attrs__ = [
290
+        'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify',
291
+        'cert', 'prefetch', 'adapters', 'stream', 'trust_env',
292
+        'max_redirects',
293
+    ]
294
+
295
+    def __init__(self):
296
+
297
+        #: A case-insensitive dictionary of headers to be sent on each
298
+        #: :class:`Request <Request>` sent from this
299
+        #: :class:`Session <Session>`.
300
+        self.headers = default_headers()
301
+
302
+        #: Default Authentication tuple or object to attach to
303
+        #: :class:`Request <Request>`.
304
+        self.auth = None
305
+
306
+        #: Dictionary mapping protocol or protocol and host to the URL of the proxy
307
+        #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to
308
+        #: be used on each :class:`Request <Request>`.
309
+        self.proxies = {}
310
+
311
+        #: Event-handling hooks.
312
+        self.hooks = default_hooks()
313
+
314
+        #: Dictionary of querystring data to attach to each
315
+        #: :class:`Request <Request>`. The dictionary values may be lists for
316
+        #: representing multivalued query parameters.
317
+        self.params = {}
318
+
319
+        #: Stream response content default.
320
+        self.stream = False
321
+
322
+        #: SSL Verification default.
323
+        self.verify = True
324
+
325
+        #: SSL certificate default.
326
+        self.cert = None
327
+
328
+        #: Maximum number of redirects allowed. If the request exceeds this
329
+        #: limit, a :class:`TooManyRedirects` exception is raised.
330
+        #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is
331
+        #: 30.
332
+        self.max_redirects = DEFAULT_REDIRECT_LIMIT
333
+
334
+        #: Trust environment settings for proxy configuration, default
335
+        #: authentication and similar.
336
+        self.trust_env = True
337
+
338
+        #: A CookieJar containing all currently outstanding cookies set on this
339
+        #: session. By default it is a
340
+        #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but
341
+        #: may be any other ``cookielib.CookieJar`` compatible object.
342
+        self.cookies = cookiejar_from_dict({})
343
+
344
+        # Default connection adapters.
345
+        self.adapters = OrderedDict()
346
+        self.mount('https://', HTTPAdapter())
347
+        self.mount('http://', HTTPAdapter())
348
+
349
+        # Only store 1000 redirects to prevent using infinite memory
350
+        self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE)
351
+
352
+    def __enter__(self):
353
+        return self
354
+
355
+    def __exit__(self, *args):
356
+        self.close()
357
+
358
+    def prepare_request(self, request):
359
+        """Constructs a :class:`PreparedRequest <PreparedRequest>` for
360
+        transmission and returns it. The :class:`PreparedRequest` has settings
361
+        merged from the :class:`Request <Request>` instance and those of the
362
+        :class:`Session`.
363
+
364
+        :param request: :class:`Request` instance to prepare with this
365
+            session's settings.
366
+        :rtype: requests.PreparedRequest
367
+        """
368
+        cookies = request.cookies or {}
369
+
370
+        # Bootstrap CookieJar.
371
+        if not isinstance(cookies, cookielib.CookieJar):
372
+            cookies = cookiejar_from_dict(cookies)
373
+
374
+        # Merge with session cookies
375
+        merged_cookies = merge_cookies(
376
+            merge_cookies(RequestsCookieJar(), self.cookies), cookies)
377
+
378
+        # Set environment's basic authentication if not explicitly set.
379
+        auth = request.auth
380
+        if self.trust_env and not auth and not self.auth:
381
+            auth = get_netrc_auth(request.url)
382
+
383
+        p = PreparedRequest()
384
+        p.prepare(
385
+            method=request.method.upper(),
386
+            url=request.url,
387
+            files=request.files,
388
+            data=request.data,
389
+            json=request.json,
390
+            headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict),
391
+            params=merge_setting(request.params, self.params),
392
+            auth=merge_setting(auth, self.auth),
393
+            cookies=merged_cookies,
394
+            hooks=merge_hooks(request.hooks, self.hooks),
395
+        )
396
+        return p
397
+
398
+    def request(self, method, url,
399
+        params=None,
400
+        data=None,
401
+        headers=None,
402
+        cookies=None,
403
+        files=None,
404
+        auth=None,
405
+        timeout=None,
406
+        allow_redirects=True,
407
+        proxies=None,
408
+        hooks=None,
409
+        stream=None,
410
+        verify=None,
411
+        cert=None,
412
+        json=None):
413
+        """Constructs a :class:`Request <Request>`, prepares it and sends it.
414
+        Returns :class:`Response <Response>` object.
415
+
416
+        :param method: method for the new :class:`Request` object.
417
+        :param url: URL for the new :class:`Request` object.
418
+        :param params: (optional) Dictionary or bytes to be sent in the query
419
+            string for the :class:`Request`.
420
+        :param data: (optional) Dictionary, bytes, or file-like object to send
421
+            in the body of the :class:`Request`.
422
+        :param json: (optional) json to send in the body of the
423
+            :class:`Request`.
424
+        :param headers: (optional) Dictionary of HTTP Headers to send with the
425
+            :class:`Request`.
426
+        :param cookies: (optional) Dict or CookieJar object to send with the
427
+            :class:`Request`.
428
+        :param files: (optional) Dictionary of ``'filename': file-like-objects``
429
+            for multipart encoding upload.
430
+        :param auth: (optional) Auth tuple or callable to enable
431
+            Basic/Digest/Custom HTTP Auth.
432
+        :param timeout: (optional) How long to wait for the server to send
433
+            data before giving up, as a float, or a :ref:`(connect timeout,
434
+            read timeout) <timeouts>` tuple.
435
+        :type timeout: float or tuple
436
+        :param allow_redirects: (optional) Set to True by default.
437
+        :type allow_redirects: bool
438
+        :param proxies: (optional) Dictionary mapping protocol or protocol and
439
+            hostname to the URL of the proxy.
440
+        :param stream: (optional) whether to immediately download the response
441
+            content. Defaults to ``False``.
442
+        :param verify: (optional) whether the SSL cert will be verified.
443
+            A CA_BUNDLE path can also be provided. Defaults to ``True``.
444
+        :param cert: (optional) if String, path to ssl client cert file (.pem).
445
+            If Tuple, ('cert', 'key') pair.
446
+        :rtype: requests.Response
447
+        """
448
+        # Create the Request.
449
+        req = Request(
450
+            method = method.upper(),
451
+            url = url,
452
+            headers = headers,
453
+            files = files,
454
+            data = data or {},
455
+            json = json,
456
+            params = params or {},
457
+            auth = auth,
458
+            cookies = cookies,
459
+            hooks = hooks,
460
+        )
461
+        prep = self.prepare_request(req)
462
+
463
+        proxies = proxies or {}
464
+
465
+        settings = self.merge_environment_settings(
466
+            prep.url, proxies, stream, verify, cert
467
+        )
468
+
469
+        # Send the request.
470
+        send_kwargs = {
471
+            'timeout': timeout,
472
+            'allow_redirects': allow_redirects,
473
+        }
474
+        send_kwargs.update(settings)
475
+        resp = self.send(prep, **send_kwargs)
476
+
477
+        return resp
478
+
479
+    def get(self, url, **kwargs):
480
+        """Sends a GET request. Returns :class:`Response` object.
481
+
482
+        :param url: URL for the new :class:`Request` object.
483
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
484
+        :rtype: requests.Response
485
+        """
486
+
487
+        kwargs.setdefault('allow_redirects', True)
488
+        return self.request('GET', url, **kwargs)
489
+
490
+    def options(self, url, **kwargs):
491
+        """Sends a OPTIONS request. Returns :class:`Response` object.
492
+
493
+        :param url: URL for the new :class:`Request` object.
494
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
495
+        :rtype: requests.Response
496
+        """
497
+
498
+        kwargs.setdefault('allow_redirects', True)
499
+        return self.request('OPTIONS', url, **kwargs)
500
+
501
+    def head(self, url, **kwargs):
502
+        """Sends a HEAD request. Returns :class:`Response` object.
503
+
504
+        :param url: URL for the new :class:`Request` object.
505
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
506
+        :rtype: requests.Response
507
+        """
508
+
509
+        kwargs.setdefault('allow_redirects', False)
510
+        return self.request('HEAD', url, **kwargs)
511
+
512
+    def post(self, url, data=None, json=None, **kwargs):
513
+        """Sends a POST request. Returns :class:`Response` object.
514
+
515
+        :param url: URL for the new :class:`Request` object.
516
+        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
517
+        :param json: (optional) json to send in the body of the :class:`Request`.
518
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
519
+        :rtype: requests.Response
520
+        """
521
+
522
+        return self.request('POST', url, data=data, json=json, **kwargs)
523
+
524
+    def put(self, url, data=None, **kwargs):
525
+        """Sends a PUT request. Returns :class:`Response` object.
526
+
527
+        :param url: URL for the new :class:`Request` object.
528
+        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
529
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
530
+        :rtype: requests.Response
531
+        """
532
+
533
+        return self.request('PUT', url, data=data, **kwargs)
534
+
535
+    def patch(self, url, data=None, **kwargs):
536
+        """Sends a PATCH request. Returns :class:`Response` object.
537
+
538
+        :param url: URL for the new :class:`Request` object.
539
+        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
540
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
541
+        :rtype: requests.Response
542
+        """
543
+
544
+        return self.request('PATCH', url,  data=data, **kwargs)
545
+
546
+    def delete(self, url, **kwargs):
547
+        """Sends a DELETE request. Returns :class:`Response` object.
548
+
549
+        :param url: URL for the new :class:`Request` object.
550
+        :param \*\*kwargs: Optional arguments that ``request`` takes.
551
+        :rtype: requests.Response
552
+        """
553
+
554
+        return self.request('DELETE', url, **kwargs)
555
+
556
+    def send(self, request, **kwargs):
557
+        """
558
+        Send a given PreparedRequest.
559
+
560
+        :rtype: requests.Response
561
+        """
562
+        # Set defaults that the hooks can utilize to ensure they always have
563
+        # the correct parameters to reproduce the previous request.
564
+        kwargs.setdefault('stream', self.stream)
565
+        kwargs.setdefault('verify', self.verify)
566
+        kwargs.setdefault('cert', self.cert)
567
+        kwargs.setdefault('proxies', self.proxies)
568
+
569
+        # It's possible that users might accidentally send a Request object.
570
+        # Guard against that specific failure case.
571
+        if isinstance(request, Request):
572
+            raise ValueError('You can only send PreparedRequests.')
573
+
574
+        # Set up variables needed for resolve_redirects and dispatching of hooks
575
+        allow_redirects = kwargs.pop('allow_redirects', True)
576
+        stream = kwargs.get('stream')
577
+        hooks = request.hooks
578
+
579
+        # Resolve URL in redirect cache, if available.
580
+        if allow_redirects:
581
+            checked_urls = set()
582
+            while request.url in self.redirect_cache:
583
+                checked_urls.add(request.url)
584
+                new_url = self.redirect_cache.get(request.url)
585
+                if new_url in checked_urls:
586
+                    break
587
+                request.url = new_url
588
+
589
+        # Get the appropriate adapter to use
590
+        adapter = self.get_adapter(url=request.url)
591
+
592
+        # Start time (approximately) of the request
593
+        start = datetime.utcnow()
594
+
595
+        # Send the request
596
+        r = adapter.send(request, **kwargs)
597
+
598
+        # Total elapsed time of the request (approximately)
599
+        r.elapsed = datetime.utcnow() - start
600
+
601
+        # Response manipulation hooks
602
+        r = dispatch_hook('response', hooks, r, **kwargs)
603
+
604
+        # Persist cookies
605
+        if r.history:
606
+
607
+            # If the hooks create history then we want those cookies too
608
+            for resp in r.history:
609
+                extract_cookies_to_jar(self.cookies, resp.request, resp.raw)
610
+
611
+        extract_cookies_to_jar(self.cookies, request, r.raw)
612
+
613
+        # Redirect resolving generator.
614
+        gen = self.resolve_redirects(r, request, **kwargs)
615
+
616
+        # Resolve redirects if allowed.
617
+        history = [resp for resp in gen] if allow_redirects else []
618
+
619
+        # Shuffle things around if there's history.
620
+        if history:
621
+            # Insert the first (original) request at the start
622
+            history.insert(0, r)
623
+            # Get the last request made
624
+            r = history.pop()
625
+            r.history = history
626
+
627
+        if not stream:
628
+            r.content
629
+
630
+        return r
631
+
632
+    def merge_environment_settings(self, url, proxies, stream, verify, cert):
633
+        """
634
+        Check the environment and merge it with some settings.
635
+
636
+        :rtype: dict
637
+        """
638
+        # Gather clues from the surrounding environment.
639
+        if self.trust_env:
640
+            # Set environment's proxies.
641
+            env_proxies = get_environ_proxies(url) or {}
642
+            for (k, v) in env_proxies.items():
643
+                proxies.setdefault(k, v)
644
+
645
+            # Look for requests environment configuration and be compatible
646
+            # with cURL.
647
+            if verify is True or verify is None:
648
+                verify = (os.environ.get('REQUESTS_CA_BUNDLE') or
649
+                          os.environ.get('CURL_CA_BUNDLE'))
650
+
651
+        # Merge all the kwargs.
652
+        proxies = merge_setting(proxies, self.proxies)
653
+        stream = merge_setting(stream, self.stream)
654
+        verify = merge_setting(verify, self.verify)
655
+        cert = merge_setting(cert, self.cert)
656
+
657
+        return {'verify': verify, 'proxies': proxies, 'stream': stream,
658
+                'cert': cert}
659
+
660
+    def get_adapter(self, url):
661
+        """
662
+        Returns the appropriate connection adapter for the given URL.
663
+
664
+        :rtype: requests.adapters.BaseAdapter
665
+        """
666
+        for (prefix, adapter) in self.adapters.items():
667
+
668
+            if url.lower().startswith(prefix):
669
+                return adapter
670
+
671
+        # Nothing matches :-/
672
+        raise InvalidSchema("No connection adapters were found for '%s'" % url)
673
+
674
+    def close(self):
675
+        """Closes all adapters and as such the session"""
676
+        for v in self.adapters.values():
677
+            v.close()
678
+
679
+    def mount(self, prefix, adapter):
680
+        """Registers a connection adapter to a prefix.
681
+
682
+        Adapters are sorted in descending order by key length.
683
+        """
684
+        self.adapters[prefix] = adapter
685
+        keys_to_move = [k for k in self.adapters if len(k) < len(prefix)]
686
+
687
+        for key in keys_to_move:
688
+            self.adapters[key] = self.adapters.pop(key)
689
+
690
+    def __getstate__(self):
691
+        state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__)
692
+        state['redirect_cache'] = dict(self.redirect_cache)
693
+        return state
694
+
695
+    def __setstate__(self, state):
696
+        redirect_cache = state.pop('redirect_cache', {})
697
+        for attr, value in state.items():
698
+            setattr(self, attr, value)
699
+
700
+        self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE)
701
+        for redirect, to in redirect_cache.items():
702
+            self.redirect_cache[redirect] = to
703
+
704
+
705
+def session():
706
+    """
707
+    Returns a :class:`Session` for context-management.
708
+
709
+    :rtype: Session
710
+    """
711
+
712
+    return Session()

+ 91
- 0
Contents/Libraries/Shared/requests/status_codes.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+from .structures import LookupDict
4
+
5
+_codes = {
6
+
7
+    # Informational.
8
+    100: ('continue',),
9
+    101: ('switching_protocols',),
10
+    102: ('processing',),
11
+    103: ('checkpoint',),
12
+    122: ('uri_too_long', 'request_uri_too_long'),
13
+    200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'),
14
+    201: ('created',),
15
+    202: ('accepted',),
16
+    203: ('non_authoritative_info', 'non_authoritative_information'),
17
+    204: ('no_content',),
18
+    205: ('reset_content', 'reset'),
19
+    206: ('partial_content', 'partial'),
20
+    207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),
21
+    208: ('already_reported',),
22
+    226: ('im_used',),
23
+
24
+    # Redirection.
25
+    300: ('multiple_choices',),
26
+    301: ('moved_permanently', 'moved', '\\o-'),
27
+    302: ('found',),
28
+    303: ('see_other', 'other'),
29
+    304: ('not_modified',),
30
+    305: ('use_proxy',),
31
+    306: ('switch_proxy',),
32
+    307: ('temporary_redirect', 'temporary_moved', 'temporary'),
33
+    308: ('permanent_redirect',
34
+          'resume_incomplete', 'resume',),  # These 2 to be removed in 3.0
35
+
36
+    # Client Error.
37
+    400: ('bad_request', 'bad'),
38
+    401: ('unauthorized',),
39
+    402: ('payment_required', 'payment'),
40
+    403: ('forbidden',),
41
+    404: ('not_found', '-o-'),
42
+    405: ('method_not_allowed', 'not_allowed'),
43
+    406: ('not_acceptable',),
44
+    407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),
45
+    408: ('request_timeout', 'timeout'),
46
+    409: ('conflict',),
47
+    410: ('gone',),
48
+    411: ('length_required',),
49
+    412: ('precondition_failed', 'precondition'),
50
+    413: ('request_entity_too_large',),
51
+    414: ('request_uri_too_large',),
52
+    415: ('unsupported_media_type', 'unsupported_media', 'media_type'),
53
+    416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),
54
+    417: ('expectation_failed',),
55
+    418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),
56
+    421: ('misdirected_request',),
57
+    422: ('unprocessable_entity', 'unprocessable'),
58
+    423: ('locked',),
59
+    424: ('failed_dependency', 'dependency'),
60
+    425: ('unordered_collection', 'unordered'),
61
+    426: ('upgrade_required', 'upgrade'),
62
+    428: ('precondition_required', 'precondition'),
63
+    429: ('too_many_requests', 'too_many'),
64
+    431: ('header_fields_too_large', 'fields_too_large'),
65
+    444: ('no_response', 'none'),
66
+    449: ('retry_with', 'retry'),
67
+    450: ('blocked_by_windows_parental_controls', 'parental_controls'),
68
+    451: ('unavailable_for_legal_reasons', 'legal_reasons'),
69
+    499: ('client_closed_request',),
70
+
71
+    # Server Error.
72
+    500: ('internal_server_error', 'server_error', '/o\\', '✗'),
73
+    501: ('not_implemented',),
74
+    502: ('bad_gateway',),
75
+    503: ('service_unavailable', 'unavailable'),
76
+    504: ('gateway_timeout',),
77
+    505: ('http_version_not_supported', 'http_version'),
78
+    506: ('variant_also_negotiates',),
79
+    507: ('insufficient_storage',),
80
+    509: ('bandwidth_limit_exceeded', 'bandwidth'),
81
+    510: ('not_extended',),
82
+    511: ('network_authentication_required', 'network_auth', 'network_authentication'),
83
+}
84
+
85
+codes = LookupDict(name='status_codes')
86
+
87
+for code, titles in _codes.items():
88
+    for title in titles:
89
+        setattr(codes, title, code)
90
+        if not title.startswith('\\'):
91
+            setattr(codes, title.upper(), code)

+ 105
- 0
Contents/Libraries/Shared/requests/structures.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+requests.structures
5
+~~~~~~~~~~~~~~~~~~~
6
+
7
+Data structures that power Requests.
8
+"""
9
+
10
+import collections
11
+
12
+from .compat import OrderedDict
13
+
14
+
15
+class CaseInsensitiveDict(collections.MutableMapping):
16
+    """A case-insensitive ``dict``-like object.
17
+
18
+    Implements all methods and operations of
19
+    ``collections.MutableMapping`` as well as dict's ``copy``. Also
20
+    provides ``lower_items``.
21
+
22
+    All keys are expected to be strings. The structure remembers the
23
+    case of the last key to be set, and ``iter(instance)``,
24
+    ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()``
25
+    will contain case-sensitive keys. However, querying and contains
26
+    testing is case insensitive::
27
+
28
+        cid = CaseInsensitiveDict()
29
+        cid['Accept'] = 'application/json'
30
+        cid['aCCEPT'] == 'application/json'  # True
31
+        list(cid) == ['Accept']  # True
32
+
33
+    For example, ``headers['content-encoding']`` will return the
34
+    value of a ``'Content-Encoding'`` response header, regardless
35
+    of how the header name was originally stored.
36
+
37
+    If the constructor, ``.update``, or equality comparison
38
+    operations are given keys that have equal ``.lower()``s, the
39
+    behavior is undefined.
40
+    """
41
+
42
+    def __init__(self, data=None, **kwargs):
43
+        self._store = OrderedDict()
44
+        if data is None:
45
+            data = {}
46
+        self.update(data, **kwargs)
47
+
48
+    def __setitem__(self, key, value):
49
+        # Use the lowercased key for lookups, but store the actual
50
+        # key alongside the value.
51
+        self._store[key.lower()] = (key, value)
52
+
53
+    def __getitem__(self, key):
54
+        return self._store[key.lower()][1]
55
+
56
+    def __delitem__(self, key):
57
+        del self._store[key.lower()]
58
+
59
+    def __iter__(self):
60
+        return (casedkey for casedkey, mappedvalue in self._store.values())
61
+
62
+    def __len__(self):
63
+        return len(self._store)
64
+
65
+    def lower_items(self):
66
+        """Like iteritems(), but with all lowercase keys."""
67
+        return (
68
+            (lowerkey, keyval[1])
69
+            for (lowerkey, keyval)
70
+            in self._store.items()
71
+        )
72
+
73
+    def __eq__(self, other):
74
+        if isinstance(other, collections.Mapping):
75
+            other = CaseInsensitiveDict(other)
76
+        else:
77
+            return NotImplemented
78
+        # Compare insensitively
79
+        return dict(self.lower_items()) == dict(other.lower_items())
80
+
81
+    # Copy is required
82
+    def copy(self):
83
+        return CaseInsensitiveDict(self._store.values())
84
+
85
+    def __repr__(self):
86
+        return str(dict(self.items()))
87
+
88
+
89
+class LookupDict(dict):
90
+    """Dictionary lookup object."""
91
+
92
+    def __init__(self, name=None):
93
+        self.name = name
94
+        super(LookupDict, self).__init__()
95
+
96
+    def __repr__(self):
97
+        return '<lookup \'%s\'>' % (self.name)
98
+
99
+    def __getitem__(self, key):
100
+        # We allow fall-through here, so values default to None
101
+
102
+        return self.__dict__.get(key, None)
103
+
104
+    def get(self, key, default=None):
105
+        return self.__dict__.get(key, default)

+ 817
- 0
Contents/Libraries/Shared/requests/utils.py View File

1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+requests.utils
5
+~~~~~~~~~~~~~~
6
+
7
+This module provides utility functions that are used within Requests
8
+that are also useful for external consumption.
9
+"""
10
+
11
+import cgi
12
+import codecs
13
+import collections
14
+import io
15
+import os
16
+import re
17
+import socket
18
+import struct
19
+import warnings
20
+
21
+from . import __version__
22
+from . import certs
23
+from .compat import parse_http_list as _parse_list_header
24
+from .compat import (quote, urlparse, bytes, str, OrderedDict, unquote, is_py2,
25
+                     builtin_str, getproxies, proxy_bypass, urlunparse,
26
+                     basestring)
27
+from .cookies import RequestsCookieJar, cookiejar_from_dict
28
+from .structures import CaseInsensitiveDict
29
+from .exceptions import InvalidURL, InvalidHeader, FileModeWarning
30
+
31
+_hush_pyflakes = (RequestsCookieJar,)
32
+
33
+NETRC_FILES = ('.netrc', '_netrc')
34
+
35
+DEFAULT_CA_BUNDLE_PATH = certs.where()
36
+
37
+
38
+def dict_to_sequence(d):
39
+    """Returns an internal sequence dictionary update."""
40
+
41
+    if hasattr(d, 'items'):
42
+        d = d.items()
43
+
44
+    return d
45
+
46
+
47
+def super_len(o):
48
+    total_length = 0
49
+    current_position = 0
50
+
51
+    if hasattr(o, '__len__'):
52
+        total_length = len(o)
53
+
54
+    elif hasattr(o, 'len'):
55
+        total_length = o.len
56
+
57
+    elif hasattr(o, 'getvalue'):
58
+        # e.g. BytesIO, cStringIO.StringIO
59
+        total_length = len(o.getvalue())
60
+
61
+    elif hasattr(o, 'fileno'):
62
+        try:
63
+            fileno = o.fileno()
64
+        except io.UnsupportedOperation:
65
+            pass
66
+        else:
67
+            total_length = os.fstat(fileno).st_size
68
+
69
+            # Having used fstat to determine the file length, we need to
70
+            # confirm that this file was opened up in binary mode.
71
+            if 'b' not in o.mode:
72
+                warnings.warn((
73
+                    "Requests has determined the content-length for this "
74
+                    "request using the binary size of the file: however, the "
75
+                    "file has been opened in text mode (i.e. without the 'b' "
76
+                    "flag in the mode). This may lead to an incorrect "
77
+                    "content-length. In Requests 3.0, support will be removed "
78
+                    "for files in text mode."),
79
+                    FileModeWarning
80
+                )
81
+
82
+    if hasattr(o, 'tell'):
83
+        try:
84
+            current_position = o.tell()
85
+        except (OSError, IOError):
86
+            # This can happen in some weird situations, such as when the file
87
+            # is actually a special file descriptor like stdin. In this
88
+            # instance, we don't know what the length is, so set it to zero and
89
+            # let requests chunk it instead.
90
+            current_position = total_length
91
+
92
+    return max(0, total_length - current_position)
93
+
94
+
95
+def get_netrc_auth(url, raise_errors=False):
96
+    """Returns the Requests tuple auth for a given url from netrc."""
97
+
98
+    try:
99
+        from netrc import netrc, NetrcParseError
100
+
101
+        netrc_path = None
102
+
103
+        for f in NETRC_FILES:
104
+            try:
105
+                loc = os.path.expanduser('~/{0}'.format(f))
106
+            except KeyError:
107
+                # os.path.expanduser can fail when $HOME is undefined and
108
+                # getpwuid fails. See http://bugs.python.org/issue20164 &
109
+                # https://github.com/kennethreitz/requests/issues/1846
110
+                return
111
+
112
+            if os.path.exists(loc):
113
+                netrc_path = loc
114
+                break
115
+
116
+        # Abort early if there isn't one.
117
+        if netrc_path is None:
118
+            return
119
+
120
+        ri = urlparse(url)
121
+
122
+        # Strip port numbers from netloc. This weird `if...encode`` dance is
123
+        # used for Python 3.2, which doesn't support unicode literals.
124
+        splitstr = b':'
125
+        if isinstance(url, str):
126
+            splitstr = splitstr.decode('ascii')
127
+        host = ri.netloc.split(splitstr)[0]
128
+
129
+        try:
130
+            _netrc = netrc(netrc_path).authenticators(host)
131
+            if _netrc:
132
+                # Return with login / password
133
+                login_i = (0 if _netrc[0] else 1)
134
+                return (_netrc[login_i], _netrc[2])
135
+        except (NetrcParseError, IOError):
136
+            # If there was a parsing error or a permissions issue reading the file,
137
+            # we'll just skip netrc auth unless explicitly asked to raise errors.
138
+            if raise_errors:
139
+                raise
140
+
141
+    # AppEngine hackiness.
142
+    except (ImportError, AttributeError):
143
+        pass
144
+
145
+
146
+def guess_filename(obj):
147
+    """Tries to guess the filename of the given object."""
148
+    name = getattr(obj, 'name', None)
149
+    if (name and isinstance(name, basestring) and name[0] != '<' and
150
+            name[-1] != '>'):
151
+        return os.path.basename(name)
152
+
153
+
154
+def from_key_val_list(value):
155
+    """Take an object and test to see if it can be represented as a
156
+    dictionary. Unless it can not be represented as such, return an
157
+    OrderedDict, e.g.,
158
+
159
+    ::
160
+
161
+        >>> from_key_val_list([('key', 'val')])
162
+        OrderedDict([('key', 'val')])
163
+        >>> from_key_val_list('string')
164
+        ValueError: need more than 1 value to unpack
165
+        >>> from_key_val_list({'key': 'val'})
166
+        OrderedDict([('key', 'val')])
167
+
168
+    :rtype: OrderedDict
169
+    """
170
+    if value is None:
171
+        return None
172
+
173
+    if isinstance(value, (str, bytes, bool, int)):
174
+        raise ValueError('cannot encode objects that are not 2-tuples')
175
+
176
+    return OrderedDict(value)
177
+
178
+
179
+def to_key_val_list(value):
180
+    """Take an object and test to see if it can be represented as a
181
+    dictionary. If it can be, return a list of tuples, e.g.,
182
+
183
+    ::
184
+
185
+        >>> to_key_val_list([('key', 'val')])
186
+        [('key', 'val')]
187
+        >>> to_key_val_list({'key': 'val'})
188
+        [('key', 'val')]
189
+        >>> to_key_val_list('string')
190
+        ValueError: cannot encode objects that are not 2-tuples.
191
+
192
+    :rtype: list
193
+    """
194
+    if value is None:
195
+        return None
196
+
197
+    if isinstance(value, (str, bytes, bool, int)):
198
+        raise ValueError('cannot encode objects that are not 2-tuples')
199
+
200
+    if isinstance(value, collections.Mapping):
201
+        value = value.items()
202
+
203
+    return list(value)
204
+
205
+
206
+# From mitsuhiko/werkzeug (used with permission).
207
+def parse_list_header(value):
208
+    """Parse lists as described by RFC 2068 Section 2.
209
+
210
+    In particular, parse comma-separated lists where the elements of
211
+    the list may include quoted-strings.  A quoted-string could
212
+    contain a comma.  A non-quoted string could have quotes in the
213
+    middle.  Quotes are removed automatically after parsing.
214
+
215
+    It basically works like :func:`parse_set_header` just that items
216
+    may appear multiple times and case sensitivity is preserved.
217
+
218
+    The return value is a standard :class:`list`:
219
+
220
+    >>> parse_list_header('token, "quoted value"')
221
+    ['token', 'quoted value']
222
+
223
+    To create a header from the :class:`list` again, use the
224
+    :func:`dump_header` function.
225
+
226
+    :param value: a string with a list header.
227
+    :return: :class:`list`
228
+    :rtype: list
229
+    """
230
+    result = []
231
+    for item in _parse_list_header(value):
232
+        if item[:1] == item[-1:] == '"':
233
+            item = unquote_header_value(item[1:-1])
234
+        result.append(item)
235
+    return result
236
+
237
+
238
+# From mitsuhiko/werkzeug (used with permission).
239
+def parse_dict_header(value):
240
+    """Parse lists of key, value pairs as described by RFC 2068 Section 2 and
241
+    convert them into a python dict:
242
+
243
+    >>> d = parse_dict_header('foo="is a fish", bar="as well"')
244
+    >>> type(d) is dict
245
+    True
246
+    >>> sorted(d.items())
247
+    [('bar', 'as well'), ('foo', 'is a fish')]
248
+
249
+    If there is no value for a key it will be `None`:
250
+
251
+    >>> parse_dict_header('key_without_value')
252
+    {'key_without_value': None}
253
+
254
+    To create a header from the :class:`dict` again, use the
255
+    :func:`dump_header` function.
256
+
257
+    :param value: a string with a dict header.
258
+    :return: :class:`dict`
259
+    :rtype: dict
260
+    """
261
+    result = {}
262
+    for item in _parse_list_header(value):
263
+        if '=' not in item:
264
+            result[item] = None
265
+            continue
266
+        name, value = item.split('=', 1)
267
+        if value[:1] == value[-1:] == '"':
268
+            value = unquote_header_value(value[1:-1])
269
+        result[name] = value
270
+    return result
271
+
272
+
273
+# From mitsuhiko/werkzeug (used with permission).
274
+def unquote_header_value(value, is_filename=False):
275
+    r"""Unquotes a header value.  (Reversal of :func:`quote_header_value`).
276
+    This does not use the real unquoting but what browsers are actually
277
+    using for quoting.
278
+
279
+    :param value: the header value to unquote.
280
+    :rtype: str
281
+    """
282
+    if value and value[0] == value[-1] == '"':
283
+        # this is not the real unquoting, but fixing this so that the
284
+        # RFC is met will result in bugs with internet explorer and
285
+        # probably some other browsers as well.  IE for example is
286
+        # uploading files with "C:\foo\bar.txt" as filename
287
+        value = value[1:-1]
288
+
289
+        # if this is a filename and the starting characters look like
290
+        # a UNC path, then just return the value without quotes.  Using the
291
+        # replace sequence below on a UNC path has the effect of turning
292
+        # the leading double slash into a single slash and then
293
+        # _fix_ie_filename() doesn't work correctly.  See #458.
294
+        if not is_filename or value[:2] != '\\\\':
295
+            return value.replace('\\\\', '\\').replace('\\"', '"')
296
+    return value
297
+
298
+
299
+def dict_from_cookiejar(cj):
300
+    """Returns a key/value dictionary from a CookieJar.
301
+
302
+    :param cj: CookieJar object to extract cookies from.
303
+    :rtype: dict
304
+    """
305
+
306
+    cookie_dict = {}
307
+
308
+    for cookie in cj:
309
+        cookie_dict[cookie.name] = cookie.value
310
+
311
+    return cookie_dict
312
+
313
+
314
+def add_dict_to_cookiejar(cj, cookie_dict):
315
+    """Returns a CookieJar from a key/value dictionary.
316
+
317
+    :param cj: CookieJar to insert cookies into.
318
+    :param cookie_dict: Dict of key/values to insert into CookieJar.
319
+    :rtype: CookieJar
320
+    """
321
+
322
+    cj2 = cookiejar_from_dict(cookie_dict)
323
+    cj.update(cj2)
324
+    return cj
325
+
326
+
327
+def get_encodings_from_content(content):
328
+    """Returns encodings from given content string.
329
+
330
+    :param content: bytestring to extract encodings from.
331
+    """
332
+    warnings.warn((
333
+        'In requests 3.0, get_encodings_from_content will be removed. For '
334
+        'more information, please see the discussion on issue #2266. (This'
335
+        ' warning should only appear once.)'),
336
+        DeprecationWarning)
337
+
338
+    charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I)
339
+    pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I)
340
+    xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]')
341
+
342
+    return (charset_re.findall(content) +
343
+            pragma_re.findall(content) +
344
+            xml_re.findall(content))
345
+
346
+
347
+def get_encoding_from_headers(headers):
348
+    """Returns encodings from given HTTP Header Dict.
349
+
350
+    :param headers: dictionary to extract encoding from.
351
+    :rtype: str
352
+    """
353
+
354
+    content_type = headers.get('content-type')
355
+
356
+    if not content_type:
357
+        return None
358
+
359
+    content_type, params = cgi.parse_header(content_type)
360
+
361
+    if 'charset' in params:
362
+        return params['charset'].strip("'\"")
363
+
364
+    if 'text' in content_type:
365
+        return 'ISO-8859-1'
366
+
367
+
368
+def stream_decode_response_unicode(iterator, r):
369
+    """Stream decodes a iterator."""
370
+
371
+    if r.encoding is None:
372
+        for item in iterator:
373
+            yield item
374
+        return
375
+
376
+    decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace')
377
+    for chunk in iterator:
378
+        rv = decoder.decode(chunk)
379
+        if rv:
380
+            yield rv
381
+    rv = decoder.decode(b'', final=True)
382
+    if rv:
383
+        yield rv
384
+
385
+
386
+def iter_slices(string, slice_length):
387
+    """Iterate over slices of a string."""
388
+    pos = 0
389
+    if slice_length is None or slice_length <= 0:
390
+        slice_length = len(string)
391
+    while pos < len(string):
392
+        yield string[pos:pos + slice_length]
393
+        pos += slice_length
394
+
395
+
396
+def get_unicode_from_response(r):
397
+    """Returns the requested content back in unicode.
398
+
399
+    :param r: Response object to get unicode content from.
400
+
401
+    Tried:
402
+
403
+    1. charset from content-type
404
+    2. fall back and replace all unicode characters
405
+
406
+    :rtype: str
407
+    """
408
+    warnings.warn((
409
+        'In requests 3.0, get_unicode_from_response will be removed. For '
410
+        'more information, please see the discussion on issue #2266. (This'
411
+        ' warning should only appear once.)'),
412
+        DeprecationWarning)
413
+
414
+    tried_encodings = []
415
+
416
+    # Try charset from content-type
417
+    encoding = get_encoding_from_headers(r.headers)
418
+
419
+    if encoding:
420
+        try:
421
+            return str(r.content, encoding)
422
+        except UnicodeError:
423
+            tried_encodings.append(encoding)
424
+
425
+    # Fall back:
426
+    try:
427
+        return str(r.content, encoding, errors='replace')
428
+    except TypeError:
429
+        return r.content
430
+
431
+
432
+# The unreserved URI characters (RFC 3986)
433
+UNRESERVED_SET = frozenset(
434
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
435
+    + "0123456789-._~")
436
+
437
+
438
+def unquote_unreserved(uri):
439
+    """Un-escape any percent-escape sequences in a URI that are unreserved
440
+    characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
441
+
442
+    :rtype: str
443
+    """
444
+    parts = uri.split('%')
445
+    for i in range(1, len(parts)):
446
+        h = parts[i][0:2]
447
+        if len(h) == 2 and h.isalnum():
448
+            try:
449
+                c = chr(int(h, 16))
450
+            except ValueError:
451
+                raise InvalidURL("Invalid percent-escape sequence: '%s'" % h)
452
+
453
+            if c in UNRESERVED_SET:
454
+                parts[i] = c + parts[i][2:]
455
+            else:
456
+                parts[i] = '%' + parts[i]
457
+        else:
458
+            parts[i] = '%' + parts[i]
459
+    return ''.join(parts)
460
+
461
+
462
+def requote_uri(uri):
463
+    """Re-quote the given URI.
464
+
465
+    This function passes the given URI through an unquote/quote cycle to
466
+    ensure that it is fully and consistently quoted.
467
+
468
+    :rtype: str
469
+    """
470
+    safe_with_percent = "!#$%&'()*+,/:;=?@[]~"
471
+    safe_without_percent = "!#$&'()*+,/:;=?@[]~"
472
+    try:
473
+        # Unquote only the unreserved characters
474
+        # Then quote only illegal characters (do not quote reserved,
475
+        # unreserved, or '%')
476
+        return quote(unquote_unreserved(uri), safe=safe_with_percent)
477
+    except InvalidURL:
478
+        # We couldn't unquote the given URI, so let's try quoting it, but
479
+        # there may be unquoted '%'s in the URI. We need to make sure they're
480
+        # properly quoted so they do not cause issues elsewhere.
481
+        return quote(uri, safe=safe_without_percent)
482
+
483
+
484
+def address_in_network(ip, net):
485
+    """This function allows you to check if on IP belongs to a network subnet
486
+
487
+    Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24
488
+             returns False if ip = 192.168.1.1 and net = 192.168.100.0/24
489
+
490
+    :rtype: bool
491
+    """
492
+    ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0]
493
+    netaddr, bits = net.split('/')
494
+    netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0]
495
+    network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask
496
+    return (ipaddr & netmask) == (network & netmask)
497
+
498
+
499
+def dotted_netmask(mask):
500
+    """Converts mask from /xx format to xxx.xxx.xxx.xxx
501
+
502
+    Example: if mask is 24 function returns 255.255.255.0
503
+
504
+    :rtype: str
505
+    """
506
+    bits = 0xffffffff ^ (1 << 32 - mask) - 1
507
+    return socket.inet_ntoa(struct.pack('>I', bits))
508
+
509
+
510
+def is_ipv4_address(string_ip):
511
+    """
512
+    :rtype: bool
513
+    """
514
+    try:
515
+        socket.inet_aton(string_ip)
516
+    except socket.error:
517
+        return False
518
+    return True
519
+
520
+
521
+def is_valid_cidr(string_network):
522
+    """
523
+    Very simple check of the cidr format in no_proxy variable.
524
+
525
+    :rtype: bool
526
+    """
527
+    if string_network.count('/') == 1:
528
+        try:
529
+            mask = int(string_network.split('/')[1])
530
+        except ValueError:
531
+            return False
532
+
533
+        if mask < 1 or mask > 32:
534
+            return False
535
+
536
+        try:
537
+            socket.inet_aton(string_network.split('/')[0])
538
+        except socket.error:
539
+            return False
540
+    else:
541
+        return False
542
+    return True
543
+
544
+
545
+def should_bypass_proxies(url):
546
+    """
547
+    Returns whether we should bypass proxies or not.
548
+
549
+    :rtype: bool
550
+    """
551
+    get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper())
552
+
553
+    # First check whether no_proxy is defined. If it is, check that the URL
554
+    # we're getting isn't in the no_proxy list.
555
+    no_proxy = get_proxy('no_proxy')
556
+    netloc = urlparse(url).netloc
557
+
558
+    if no_proxy:
559
+        # We need to check whether we match here. We need to see if we match
560
+        # the end of the netloc, both with and without the port.
561
+        no_proxy = (
562
+            host for host in no_proxy.replace(' ', '').split(',') if host
563
+        )
564
+
565
+        ip = netloc.split(':')[0]
566
+        if is_ipv4_address(ip):
567
+            for proxy_ip in no_proxy:
568
+                if is_valid_cidr(proxy_ip):
569
+                    if address_in_network(ip, proxy_ip):
570
+                        return True
571
+                elif ip == proxy_ip:
572
+                    # If no_proxy ip was defined in plain IP notation instead of cidr notation &
573
+                    # matches the IP of the index
574
+                    return True
575
+        else:
576
+            for host in no_proxy:
577
+                if netloc.endswith(host) or netloc.split(':')[0].endswith(host):
578
+                    # The URL does match something in no_proxy, so we don't want
579
+                    # to apply the proxies on this URL.
580
+                    return True
581
+
582
+    # If the system proxy settings indicate that this URL should be bypassed,
583
+    # don't proxy.
584
+    # The proxy_bypass function is incredibly buggy on OS X in early versions
585
+    # of Python 2.6, so allow this call to fail. Only catch the specific
586
+    # exceptions we've seen, though: this call failing in other ways can reveal
587
+    # legitimate problems.
588
+    try:
589
+        bypass = proxy_bypass(netloc)
590
+    except (TypeError, socket.gaierror):
591
+        bypass = False
592
+
593
+    if bypass:
594
+        return True
595
+
596
+    return False
597
+
598
+
599
+def get_environ_proxies(url):
600
+    """
601
+    Return a dict of environment proxies.
602
+
603
+    :rtype: dict
604
+    """
605
+    if should_bypass_proxies(url):
606
+        return {}
607
+    else:
608
+        return getproxies()
609
+
610
+
611
+def select_proxy(url, proxies):
612
+    """Select a proxy for the url, if applicable.
613
+
614
+    :param url: The url being for the request
615
+    :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs
616
+    """
617
+    proxies = proxies or {}
618
+    urlparts = urlparse(url)
619
+    if urlparts.hostname is None:
620
+        return proxies.get('all', proxies.get(urlparts.scheme))
621
+
622
+    proxy_keys = [
623
+        'all://' + urlparts.hostname,
624
+        'all',
625
+        urlparts.scheme + '://' + urlparts.hostname,
626
+        urlparts.scheme,
627
+    ]
628
+    proxy = None
629
+    for proxy_key in proxy_keys:
630
+        if proxy_key in proxies:
631
+            proxy = proxies[proxy_key]
632
+            break
633
+
634
+    return proxy
635
+
636
+
637
+def default_user_agent(name="python-requests"):
638
+    """
639
+    Return a string representing the default user agent.
640
+
641
+    :rtype: str
642
+    """
643
+    return '%s/%s' % (name, __version__)
644
+
645
+
646
+def default_headers():
647
+    """
648
+    :rtype: requests.structures.CaseInsensitiveDict
649
+    """
650
+    return CaseInsensitiveDict({
651
+        'User-Agent': default_user_agent(),
652
+        'Accept-Encoding': ', '.join(('gzip', 'deflate')),
653
+        'Accept': '*/*',
654
+        'Connection': 'keep-alive',
655
+    })
656
+
657
+
658
+def parse_header_links(value):
659
+    """Return a dict of parsed link headers proxies.
660
+
661
+    i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg"
662
+
663
+    :rtype: list
664
+    """
665
+
666
+    links = []
667
+
668
+    replace_chars = ' \'"'
669
+
670
+    for val in re.split(', *<', value):
671
+        try:
672
+            url, params = val.split(';', 1)
673
+        except ValueError:
674
+            url, params = val, ''
675
+
676
+        link = {'url': url.strip('<> \'"')}
677
+
678
+        for param in params.split(';'):
679
+            try:
680
+                key, value = param.split('=')
681
+            except ValueError:
682
+                break
683
+
684
+            link[key.strip(replace_chars)] = value.strip(replace_chars)
685
+
686
+        links.append(link)
687
+
688
+    return links
689
+
690
+
691
+# Null bytes; no need to recreate these on each call to guess_json_utf
692
+_null = '\x00'.encode('ascii')  # encoding to ASCII for Python 3
693
+_null2 = _null * 2
694
+_null3 = _null * 3
695
+
696
+
697
+def guess_json_utf(data):
698
+    """
699
+    :rtype: str
700
+    """
701
+    # JSON always starts with two ASCII characters, so detection is as
702
+    # easy as counting the nulls and from their location and count
703
+    # determine the encoding. Also detect a BOM, if present.
704
+    sample = data[:4]
705
+    if sample in (codecs.BOM_UTF32_LE, codecs.BOM32_BE):
706
+        return 'utf-32'     # BOM included
707
+    if sample[:3] == codecs.BOM_UTF8:
708
+        return 'utf-8-sig'  # BOM included, MS style (discouraged)
709
+    if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE):
710
+        return 'utf-16'     # BOM included
711
+    nullcount = sample.count(_null)
712
+    if nullcount == 0:
713
+        return 'utf-8'
714
+    if nullcount == 2:
715
+        if sample[::2] == _null2:   # 1st and 3rd are null
716
+            return 'utf-16-be'
717
+        if sample[1::2] == _null2:  # 2nd and 4th are null
718
+            return 'utf-16-le'
719
+        # Did not detect 2 valid UTF-16 ascii-range characters
720
+    if nullcount == 3:
721
+        if sample[:3] == _null3:
722
+            return 'utf-32-be'
723
+        if sample[1:] == _null3:
724
+            return 'utf-32-le'
725
+        # Did not detect a valid UTF-32 ascii-range character
726
+    return None
727
+
728
+
729
+def prepend_scheme_if_needed(url, new_scheme):
730
+    """Given a URL that may or may not have a scheme, prepend the given scheme.
731
+    Does not replace a present scheme with the one provided as an argument.
732
+
733
+    :rtype: str
734
+    """
735
+    scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme)
736
+
737
+    # urlparse is a finicky beast, and sometimes decides that there isn't a
738
+    # netloc present. Assume that it's being over-cautious, and switch netloc
739
+    # and path if urlparse decided there was no netloc.
740
+    if not netloc:
741
+        netloc, path = path, netloc
742
+
743
+    return urlunparse((scheme, netloc, path, params, query, fragment))
744
+
745
+
746
+def get_auth_from_url(url):
747
+    """Given a url with authentication components, extract them into a tuple of
748
+    username,password.
749
+
750
+    :rtype: (str,str)
751
+    """
752
+    parsed = urlparse(url)
753
+
754
+    try:
755
+        auth = (unquote(parsed.username), unquote(parsed.password))
756
+    except (AttributeError, TypeError):
757
+        auth = ('', '')
758
+
759
+    return auth
760
+
761
+
762
+def to_native_string(string, encoding='ascii'):
763
+    """Given a string object, regardless of type, returns a representation of
764
+    that string in the native string type, encoding and decoding where
765
+    necessary. This assumes ASCII unless told otherwise.
766
+    """
767
+    if isinstance(string, builtin_str):
768
+        out = string
769
+    else:
770
+        if is_py2:
771
+            out = string.encode(encoding)
772
+        else:
773
+            out = string.decode(encoding)
774
+
775
+    return out
776
+
777
+
778
+# Moved outside of function to avoid recompile every call
779
+_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$')
780
+_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$')
781
+
782
+def check_header_validity(header):
783
+    """Verifies that header value is a string which doesn't contain
784
+    leading whitespace or return characters. This prevents unintended
785
+    header injection.
786
+
787
+    :param header: tuple, in the format (name, value).
788
+    """
789
+    name, value = header
790
+
791
+    if isinstance(value, bytes):
792
+        pat = _CLEAN_HEADER_REGEX_BYTE
793
+    else:
794
+        pat = _CLEAN_HEADER_REGEX_STR
795
+    try:
796
+        if not pat.match(value):
797
+            raise InvalidHeader("Invalid return character or leading space in header: %s" % name)
798
+    except TypeError:
799
+        raise InvalidHeader("Header value %s must be of type str or bytes, "
800
+                            "not %s" % (value, type(value)))
801
+
802
+
803
+def urldefragauth(url):
804
+    """
805
+    Given a url remove the fragment and the authentication part.
806
+
807
+    :rtype: str
808
+    """
809
+    scheme, netloc, path, params, query, fragment = urlparse(url)
810
+
811
+    # see func:`prepend_scheme_if_needed`
812
+    if not netloc:
813
+        netloc, path = path, netloc
814
+
815
+    netloc = netloc.rsplit('@', 1)[-1]
816
+
817
+    return urlunparse((scheme, netloc, path, params, query, ''))

BIN
Contents/Resources/art-default.jpg View File


BIN
Contents/Resources/back.png View File


+ 0
- 0
Contents/Resources/cinemalive.png View File


Some files were not shown because too many files changed in this diff